mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
Merge c741e49150 ("Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma") into android-mainline
Steps on the way to 5.16-rc5 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I50dac35f0982fcf9beba60bb5fcb734621ded5db
This commit is contained in:
@@ -439,11 +439,9 @@ preemption. The following substitution works on both kernels::
|
||||
spin_lock(&p->lock);
|
||||
p->count += this_cpu_read(var2);
|
||||
|
||||
On a non-PREEMPT_RT kernel migrate_disable() maps to preempt_disable()
|
||||
which makes the above code fully equivalent. On a PREEMPT_RT kernel
|
||||
migrate_disable() ensures that the task is pinned on the current CPU which
|
||||
in turn guarantees that the per-CPU access to var1 and var2 are staying on
|
||||
the same CPU.
|
||||
the same CPU while the task remains preemptible.
|
||||
|
||||
The migrate_disable() substitution is not valid for the following
|
||||
scenario::
|
||||
@@ -456,9 +454,8 @@ scenario::
|
||||
p = this_cpu_ptr(&var1);
|
||||
p->val = func2();
|
||||
|
||||
While correct on a non-PREEMPT_RT kernel, this breaks on PREEMPT_RT because
|
||||
here migrate_disable() does not protect against reentrancy from a
|
||||
preempting task. A correct substitution for this case is::
|
||||
This breaks because migrate_disable() does not protect against reentrancy from
|
||||
a preempting task. A correct substitution for this case is::
|
||||
|
||||
func()
|
||||
{
|
||||
|
||||
@@ -9336,7 +9336,6 @@ S: Maintained
|
||||
F: drivers/iio/pressure/dps310.c
|
||||
|
||||
INFINIBAND SUBSYSTEM
|
||||
M: Doug Ledford <dledford@redhat.com>
|
||||
M: Jason Gunthorpe <jgg@nvidia.com>
|
||||
L: linux-rdma@vger.kernel.org
|
||||
S: Supported
|
||||
@@ -12187,8 +12186,8 @@ F: drivers/net/ethernet/mellanox/mlx5/core/fpga/*
|
||||
F: include/linux/mlx5/mlx5_ifc_fpga.h
|
||||
|
||||
MELLANOX ETHERNET SWITCH DRIVERS
|
||||
M: Jiri Pirko <jiri@nvidia.com>
|
||||
M: Ido Schimmel <idosch@nvidia.com>
|
||||
M: Petr Machata <petrm@nvidia.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://www.mellanox.com
|
||||
@@ -16636,7 +16635,6 @@ W: http://www.ibm.com/developerworks/linux/linux390/
|
||||
F: drivers/iommu/s390-iommu.c
|
||||
|
||||
S390 IUCV NETWORK LAYER
|
||||
M: Julian Wiedmann <jwi@linux.ibm.com>
|
||||
M: Alexandra Winter <wintera@linux.ibm.com>
|
||||
M: Wenjia Zhang <wenjia@linux.ibm.com>
|
||||
L: linux-s390@vger.kernel.org
|
||||
@@ -16648,7 +16646,6 @@ F: include/net/iucv/
|
||||
F: net/iucv/
|
||||
|
||||
S390 NETWORK DRIVERS
|
||||
M: Julian Wiedmann <jwi@linux.ibm.com>
|
||||
M: Alexandra Winter <wintera@linux.ibm.com>
|
||||
M: Wenjia Zhang <wenjia@linux.ibm.com>
|
||||
L: linux-s390@vger.kernel.org
|
||||
|
||||
@@ -98,7 +98,7 @@ do { \
|
||||
#define emit(...) __emit(__VA_ARGS__)
|
||||
|
||||
/* Workaround for R10000 ll/sc errata */
|
||||
#ifdef CONFIG_WAR_R10000
|
||||
#ifdef CONFIG_WAR_R10000_LLSC
|
||||
#define LLSC_beqz beqzl
|
||||
#else
|
||||
#define LLSC_beqz beqz
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <linux/falloc.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/module.h>
|
||||
#include "blk.h"
|
||||
|
||||
static inline struct inode *bdev_file_inode(struct file *file)
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <linux/shmem_fs.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
#include <asm/set_memory.h>
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <linux/slab.h> /* fault-inject.h is not standalone! */
|
||||
|
||||
#include <linux/fault-inject.h>
|
||||
#include <linux/sched/mm.h>
|
||||
|
||||
#include "gem/i915_gem_lmem.h"
|
||||
#include "i915_trace.h"
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/sched/clock.h>
|
||||
#include <linux/sched/signal.h>
|
||||
#include <linux/sched/mm.h>
|
||||
|
||||
#include "gem/i915_gem_context.h"
|
||||
#include "gt/intel_breadcrumbs.h"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/reset.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/sched/mm.h>
|
||||
|
||||
#include "msm_drv.h"
|
||||
#include "msm_gem.h"
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/shmem_fs.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/module.h>
|
||||
#include <drm/drm_cache.h>
|
||||
#include <drm/ttm/ttm_bo_driver.h>
|
||||
|
||||
|
||||
@@ -207,14 +207,14 @@ config HID_CHERRY
|
||||
|
||||
config HID_CHICONY
|
||||
tristate "Chicony devices"
|
||||
depends on HID
|
||||
depends on USB_HID
|
||||
default !EXPERT
|
||||
help
|
||||
Support for Chicony Tactical pad and special keys on Chicony keyboards.
|
||||
|
||||
config HID_CORSAIR
|
||||
tristate "Corsair devices"
|
||||
depends on HID && USB && LEDS_CLASS
|
||||
depends on USB_HID && LEDS_CLASS
|
||||
help
|
||||
Support for Corsair devices that are not fully compliant with the
|
||||
HID standard.
|
||||
@@ -245,7 +245,7 @@ config HID_MACALLY
|
||||
|
||||
config HID_PRODIKEYS
|
||||
tristate "Prodikeys PC-MIDI Keyboard support"
|
||||
depends on HID && SND
|
||||
depends on USB_HID && SND
|
||||
select SND_RAWMIDI
|
||||
help
|
||||
Support for Prodikeys PC-MIDI Keyboard device support.
|
||||
@@ -560,7 +560,7 @@ config HID_LENOVO
|
||||
|
||||
config HID_LOGITECH
|
||||
tristate "Logitech devices"
|
||||
depends on HID
|
||||
depends on USB_HID
|
||||
depends on LEDS_CLASS
|
||||
default !EXPERT
|
||||
help
|
||||
@@ -938,7 +938,7 @@ config HID_SAITEK
|
||||
|
||||
config HID_SAMSUNG
|
||||
tristate "Samsung InfraRed remote control or keyboards"
|
||||
depends on HID
|
||||
depends on USB_HID
|
||||
help
|
||||
Support for Samsung InfraRed remote control or keyboards.
|
||||
|
||||
|
||||
@@ -1028,8 +1028,7 @@ static int asus_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
if (drvdata->quirks & QUIRK_IS_MULTITOUCH)
|
||||
drvdata->tp = &asus_i2c_tp;
|
||||
|
||||
if ((drvdata->quirks & QUIRK_T100_KEYBOARD) &&
|
||||
hid_is_using_ll_driver(hdev, &usb_hid_driver)) {
|
||||
if ((drvdata->quirks & QUIRK_T100_KEYBOARD) && hid_is_usb(hdev)) {
|
||||
struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
|
||||
|
||||
if (intf->altsetting->desc.bInterfaceNumber == T100_TPAD_INTF) {
|
||||
@@ -1057,8 +1056,7 @@ static int asus_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
drvdata->tp = &asus_t100chi_tp;
|
||||
}
|
||||
|
||||
if ((drvdata->quirks & QUIRK_MEDION_E1239T) &&
|
||||
hid_is_using_ll_driver(hdev, &usb_hid_driver)) {
|
||||
if ((drvdata->quirks & QUIRK_MEDION_E1239T) && hid_is_usb(hdev)) {
|
||||
struct usb_host_interface *alt =
|
||||
to_usb_interface(hdev->dev.parent)->altsetting;
|
||||
|
||||
|
||||
@@ -191,7 +191,7 @@ static void bigben_worker(struct work_struct *work)
|
||||
struct bigben_device, worker);
|
||||
struct hid_field *report_field = bigben->report->field[0];
|
||||
|
||||
if (bigben->removed)
|
||||
if (bigben->removed || !report_field)
|
||||
return;
|
||||
|
||||
if (bigben->work_led) {
|
||||
|
||||
@@ -114,6 +114,9 @@ static int ch_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
hdev->quirks |= HID_QUIRK_INPUT_PER_APP;
|
||||
ret = hid_parse(hdev);
|
||||
if (ret) {
|
||||
|
||||
@@ -553,7 +553,12 @@ static int corsair_probe(struct hid_device *dev, const struct hid_device_id *id)
|
||||
int ret;
|
||||
unsigned long quirks = id->driver_data;
|
||||
struct corsair_drvdata *drvdata;
|
||||
struct usb_interface *usbif = to_usb_interface(dev->dev.parent);
|
||||
struct usb_interface *usbif;
|
||||
|
||||
if (!hid_is_usb(dev))
|
||||
return -EINVAL;
|
||||
|
||||
usbif = to_usb_interface(dev->dev.parent);
|
||||
|
||||
drvdata = devm_kzalloc(&dev->dev, sizeof(struct corsair_drvdata),
|
||||
GFP_KERNEL);
|
||||
|
||||
@@ -50,7 +50,7 @@ struct elan_drvdata {
|
||||
|
||||
static int is_not_elan_touchpad(struct hid_device *hdev)
|
||||
{
|
||||
if (hdev->bus == BUS_USB) {
|
||||
if (hid_is_usb(hdev)) {
|
||||
struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
|
||||
|
||||
return (intf->altsetting->desc.bInterfaceNumber !=
|
||||
|
||||
@@ -230,6 +230,9 @@ static int elo_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
int ret;
|
||||
struct usb_device *udev;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -915,6 +915,9 @@ static int ft260_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
struct ft260_get_chip_version_report version;
|
||||
int ret;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
dev = devm_kzalloc(&hdev->dev, sizeof(*dev), GFP_KERNEL);
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -585,6 +585,8 @@ static void hammer_remove(struct hid_device *hdev)
|
||||
static const struct hid_device_id hammer_devices[] = {
|
||||
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
|
||||
USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_DON) },
|
||||
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
|
||||
USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_EEL) },
|
||||
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
|
||||
USB_VENDOR_ID_GOOGLE, USB_DEVICE_ID_GOOGLE_HAMMER) },
|
||||
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
|
||||
|
||||
@@ -140,12 +140,17 @@ static int holtek_kbd_input_event(struct input_dev *dev, unsigned int type,
|
||||
static int holtek_kbd_probe(struct hid_device *hdev,
|
||||
const struct hid_device_id *id)
|
||||
{
|
||||
struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
|
||||
int ret = hid_parse(hdev);
|
||||
struct usb_interface *intf;
|
||||
int ret;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
ret = hid_parse(hdev);
|
||||
if (!ret)
|
||||
ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
|
||||
|
||||
intf = to_usb_interface(hdev->dev.parent);
|
||||
if (!ret && intf->cur_altsetting->desc.bInterfaceNumber == 1) {
|
||||
struct hid_input *hidinput;
|
||||
list_for_each_entry(hidinput, &hdev->inputs, list) {
|
||||
|
||||
@@ -62,6 +62,14 @@ static __u8 *holtek_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||
return rdesc;
|
||||
}
|
||||
|
||||
static int holtek_mouse_probe(struct hid_device *hdev,
|
||||
const struct hid_device_id *id)
|
||||
{
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct hid_device_id holtek_mouse_devices[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT,
|
||||
USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067) },
|
||||
@@ -83,6 +91,7 @@ static struct hid_driver holtek_mouse_driver = {
|
||||
.name = "holtek_mouse",
|
||||
.id_table = holtek_mouse_devices,
|
||||
.report_fixup = holtek_mouse_report_fixup,
|
||||
.probe = holtek_mouse_probe,
|
||||
};
|
||||
|
||||
module_hid_driver(holtek_mouse_driver);
|
||||
|
||||
@@ -399,6 +399,7 @@
|
||||
#define USB_DEVICE_ID_HP_X2_10_COVER 0x0755
|
||||
#define I2C_DEVICE_ID_HP_ENVY_X360_15 0x2d05
|
||||
#define I2C_DEVICE_ID_HP_SPECTRE_X360_15 0x2817
|
||||
#define USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN 0x2544
|
||||
#define USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN 0x2706
|
||||
#define I2C_DEVICE_ID_SURFACE_GO_TOUCHSCREEN 0x261A
|
||||
|
||||
@@ -501,6 +502,7 @@
|
||||
#define USB_DEVICE_ID_GOOGLE_MAGNEMITE 0x503d
|
||||
#define USB_DEVICE_ID_GOOGLE_MOONBALL 0x5044
|
||||
#define USB_DEVICE_ID_GOOGLE_DON 0x5050
|
||||
#define USB_DEVICE_ID_GOOGLE_EEL 0x5057
|
||||
|
||||
#define USB_VENDOR_ID_GOTOP 0x08f2
|
||||
#define USB_DEVICE_ID_SUPER_Q2 0x007f
|
||||
@@ -886,6 +888,7 @@
|
||||
#define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7
|
||||
#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9
|
||||
#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
|
||||
#define USB_DEVICE_ID_MS_SURFACE3_COVER 0x07de
|
||||
#define USB_DEVICE_ID_MS_XBOX_ONE_S_CONTROLLER 0x02fd
|
||||
#define USB_DEVICE_ID_MS_PIXART_MOUSE 0x00cb
|
||||
#define USB_DEVICE_ID_8BITDO_SN30_PRO_PLUS 0x02e0
|
||||
|
||||
@@ -325,6 +325,8 @@ static const struct hid_device_id hid_battery_quirks[] = {
|
||||
HID_BATTERY_QUIRK_IGNORE },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN),
|
||||
HID_BATTERY_QUIRK_IGNORE },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN),
|
||||
HID_BATTERY_QUIRK_IGNORE },
|
||||
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_HP_ENVY_X360_15),
|
||||
HID_BATTERY_QUIRK_IGNORE },
|
||||
{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_HP_SPECTRE_X360_15),
|
||||
|
||||
@@ -749,12 +749,18 @@ static int lg_raw_event(struct hid_device *hdev, struct hid_report *report,
|
||||
|
||||
static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
{
|
||||
struct usb_interface *iface = to_usb_interface(hdev->dev.parent);
|
||||
__u8 iface_num = iface->cur_altsetting->desc.bInterfaceNumber;
|
||||
struct usb_interface *iface;
|
||||
__u8 iface_num;
|
||||
unsigned int connect_mask = HID_CONNECT_DEFAULT;
|
||||
struct lg_drv_data *drv_data;
|
||||
int ret;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
iface = to_usb_interface(hdev->dev.parent);
|
||||
iface_num = iface->cur_altsetting->desc.bInterfaceNumber;
|
||||
|
||||
/* G29 only work with the 1st interface */
|
||||
if ((hdev->product == USB_DEVICE_ID_LOGITECH_G29_WHEEL) &&
|
||||
(iface_num != 0)) {
|
||||
|
||||
@@ -1777,7 +1777,7 @@ static int logi_dj_probe(struct hid_device *hdev,
|
||||
case recvr_type_bluetooth: no_dj_interfaces = 2; break;
|
||||
case recvr_type_dinovo: no_dj_interfaces = 2; break;
|
||||
}
|
||||
if (hid_is_using_ll_driver(hdev, &usb_hid_driver)) {
|
||||
if (hid_is_usb(hdev)) {
|
||||
intf = to_usb_interface(hdev->dev.parent);
|
||||
if (intf && intf->altsetting->desc.bInterfaceNumber >=
|
||||
no_dj_interfaces) {
|
||||
|
||||
@@ -798,12 +798,18 @@ static int pk_raw_event(struct hid_device *hdev, struct hid_report *report,
|
||||
static int pk_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
{
|
||||
int ret;
|
||||
struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
|
||||
unsigned short ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
|
||||
struct usb_interface *intf;
|
||||
unsigned short ifnum;
|
||||
unsigned long quirks = id->driver_data;
|
||||
struct pk_device *pk;
|
||||
struct pcmidi_snd *pm = NULL;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
intf = to_usb_interface(hdev->dev.parent);
|
||||
ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
|
||||
|
||||
pk = kzalloc(sizeof(*pk), GFP_KERNEL);
|
||||
if (pk == NULL) {
|
||||
hid_err(hdev, "can't alloc descriptor\n");
|
||||
|
||||
@@ -124,6 +124,7 @@ static const struct hid_device_id hid_quirks[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MCS, USB_DEVICE_ID_MCS_GAMEPADBLOCK), HID_QUIRK_MULTI_INPUT },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PIXART_MOUSE), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER), HID_QUIRK_NO_INIT_REPORTS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE3_COVER), HID_QUIRK_NO_INIT_REPORTS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_PRO_2), HID_QUIRK_NO_INIT_REPORTS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TOUCH_COVER_2), HID_QUIRK_NO_INIT_REPORTS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2), HID_QUIRK_NO_INIT_REPORTS },
|
||||
|
||||
@@ -344,6 +344,9 @@ static int arvo_probe(struct hid_device *hdev,
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
retval = hid_parse(hdev);
|
||||
if (retval) {
|
||||
hid_err(hdev, "parse failed\n");
|
||||
|
||||
@@ -324,6 +324,9 @@ static int isku_probe(struct hid_device *hdev,
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
retval = hid_parse(hdev);
|
||||
if (retval) {
|
||||
hid_err(hdev, "parse failed\n");
|
||||
|
||||
@@ -749,6 +749,9 @@ static int kone_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
retval = hid_parse(hdev);
|
||||
if (retval) {
|
||||
hid_err(hdev, "parse failed\n");
|
||||
|
||||
@@ -431,6 +431,9 @@ static int koneplus_probe(struct hid_device *hdev,
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
retval = hid_parse(hdev);
|
||||
if (retval) {
|
||||
hid_err(hdev, "parse failed\n");
|
||||
|
||||
@@ -133,6 +133,9 @@ static int konepure_probe(struct hid_device *hdev,
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
retval = hid_parse(hdev);
|
||||
if (retval) {
|
||||
hid_err(hdev, "parse failed\n");
|
||||
|
||||
@@ -501,6 +501,9 @@ static int kovaplus_probe(struct hid_device *hdev,
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
retval = hid_parse(hdev);
|
||||
if (retval) {
|
||||
hid_err(hdev, "parse failed\n");
|
||||
|
||||
@@ -160,6 +160,9 @@ static int lua_probe(struct hid_device *hdev,
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
retval = hid_parse(hdev);
|
||||
if (retval) {
|
||||
hid_err(hdev, "parse failed\n");
|
||||
|
||||
@@ -449,6 +449,9 @@ static int pyra_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
retval = hid_parse(hdev);
|
||||
if (retval) {
|
||||
hid_err(hdev, "parse failed\n");
|
||||
|
||||
@@ -141,6 +141,9 @@ static int ryos_probe(struct hid_device *hdev,
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
retval = hid_parse(hdev);
|
||||
if (retval) {
|
||||
hid_err(hdev, "parse failed\n");
|
||||
|
||||
@@ -113,6 +113,9 @@ static int savu_probe(struct hid_device *hdev,
|
||||
{
|
||||
int retval;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
retval = hid_parse(hdev);
|
||||
if (retval) {
|
||||
hid_err(hdev, "parse failed\n");
|
||||
|
||||
@@ -152,6 +152,9 @@ static int samsung_probe(struct hid_device *hdev,
|
||||
int ret;
|
||||
unsigned int cmask = HID_CONNECT_DEFAULT;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
ret = hid_parse(hdev);
|
||||
if (ret) {
|
||||
hid_err(hdev, "parse failed\n");
|
||||
|
||||
@@ -3000,7 +3000,6 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
sc->quirks = quirks;
|
||||
hid_set_drvdata(hdev, sc);
|
||||
sc->hdev = hdev;
|
||||
usbdev = to_usb_device(sc->hdev->dev.parent->parent);
|
||||
|
||||
ret = hid_parse(hdev);
|
||||
if (ret) {
|
||||
@@ -3038,14 +3037,23 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
*/
|
||||
if (!(hdev->claimed & HID_CLAIMED_INPUT)) {
|
||||
hid_err(hdev, "failed to claim input\n");
|
||||
hid_hw_stop(hdev);
|
||||
return -ENODEV;
|
||||
ret = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (sc->quirks & (GHL_GUITAR_PS3WIIU | GHL_GUITAR_PS4)) {
|
||||
if (!hid_is_usb(hdev)) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
usbdev = to_usb_device(sc->hdev->dev.parent->parent);
|
||||
|
||||
sc->ghl_urb = usb_alloc_urb(0, GFP_ATOMIC);
|
||||
if (!sc->ghl_urb)
|
||||
return -ENOMEM;
|
||||
if (!sc->ghl_urb) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (sc->quirks & GHL_GUITAR_PS3WIIU)
|
||||
ret = ghl_init_urb(sc, usbdev, ghl_ps3wiiu_magic_data,
|
||||
@@ -3055,7 +3063,7 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
ARRAY_SIZE(ghl_ps4_magic_data));
|
||||
if (ret) {
|
||||
hid_err(hdev, "error preparing URB\n");
|
||||
return ret;
|
||||
goto err;
|
||||
}
|
||||
|
||||
timer_setup(&sc->ghl_poke_timer, ghl_magic_poke, 0);
|
||||
@@ -3064,6 +3072,10 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
err:
|
||||
hid_hw_stop(hdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void sony_remove(struct hid_device *hdev)
|
||||
|
||||
@@ -274,6 +274,9 @@ static int thrustmaster_probe(struct hid_device *hdev, const struct hid_device_i
|
||||
int ret = 0;
|
||||
struct tm_wheel *tm_wheel = NULL;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
ret = hid_parse(hdev);
|
||||
if (ret) {
|
||||
hid_err(hdev, "parse failed with error %d\n", ret);
|
||||
|
||||
@@ -311,7 +311,7 @@ static int u2fzero_probe(struct hid_device *hdev,
|
||||
unsigned int minor;
|
||||
int ret;
|
||||
|
||||
if (!hid_is_using_ll_driver(hdev, &usb_hid_driver))
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
dev = devm_kzalloc(&hdev->dev, sizeof(*dev), GFP_KERNEL);
|
||||
|
||||
@@ -164,6 +164,9 @@ static int uclogic_probe(struct hid_device *hdev,
|
||||
struct uclogic_drvdata *drvdata = NULL;
|
||||
bool params_initialized = false;
|
||||
|
||||
if (!hid_is_usb(hdev))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* libinput requires the pad interface to be on a different node
|
||||
* than the pen, so use QUIRK_MULTI_INPUT for all tablets.
|
||||
|
||||
@@ -843,8 +843,7 @@ int uclogic_params_init(struct uclogic_params *params,
|
||||
struct uclogic_params p = {0, };
|
||||
|
||||
/* Check arguments */
|
||||
if (params == NULL || hdev == NULL ||
|
||||
!hid_is_using_ll_driver(hdev, &usb_hid_driver)) {
|
||||
if (params == NULL || hdev == NULL || !hid_is_usb(hdev)) {
|
||||
rc = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
@@ -266,7 +266,8 @@ static void __maybe_unused ish_resume_handler(struct work_struct *work)
|
||||
|
||||
if (ish_should_leave_d0i3(pdev) && !dev->suspend_flag
|
||||
&& IPC_IS_ISH_ILUP(fwsts)) {
|
||||
disable_irq_wake(pdev->irq);
|
||||
if (device_may_wakeup(&pdev->dev))
|
||||
disable_irq_wake(pdev->irq);
|
||||
|
||||
ish_set_host_ready(dev);
|
||||
|
||||
@@ -337,7 +338,8 @@ static int __maybe_unused ish_suspend(struct device *device)
|
||||
*/
|
||||
pci_save_state(pdev);
|
||||
|
||||
enable_irq_wake(pdev->irq);
|
||||
if (device_may_wakeup(&pdev->dev))
|
||||
enable_irq_wake(pdev->irq);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
|
||||
@@ -726,7 +726,7 @@ static void wacom_retrieve_hid_descriptor(struct hid_device *hdev,
|
||||
* Skip the query for this type and modify defaults based on
|
||||
* interface number.
|
||||
*/
|
||||
if (features->type == WIRELESS) {
|
||||
if (features->type == WIRELESS && intf) {
|
||||
if (intf->cur_altsetting->desc.bInterfaceNumber == 0)
|
||||
features->device_type = WACOM_DEVICETYPE_WL_MONITOR;
|
||||
else
|
||||
@@ -2214,7 +2214,7 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix)
|
||||
if ((features->type == HID_GENERIC) && !strcmp("Wacom HID", features->name)) {
|
||||
char *product_name = wacom->hdev->name;
|
||||
|
||||
if (hid_is_using_ll_driver(wacom->hdev, &usb_hid_driver)) {
|
||||
if (hid_is_usb(wacom->hdev)) {
|
||||
struct usb_interface *intf = to_usb_interface(wacom->hdev->dev.parent);
|
||||
struct usb_device *dev = interface_to_usbdev(intf);
|
||||
product_name = dev->product;
|
||||
@@ -2451,6 +2451,9 @@ static void wacom_wireless_work(struct work_struct *work)
|
||||
|
||||
wacom_destroy_battery(wacom);
|
||||
|
||||
if (!usbdev)
|
||||
return;
|
||||
|
||||
/* Stylus interface */
|
||||
hdev1 = usb_get_intfdata(usbdev->config->interface[1]);
|
||||
wacom1 = hid_get_drvdata(hdev1);
|
||||
@@ -2730,8 +2733,6 @@ static void wacom_mode_change_work(struct work_struct *work)
|
||||
static int wacom_probe(struct hid_device *hdev,
|
||||
const struct hid_device_id *id)
|
||||
{
|
||||
struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
|
||||
struct usb_device *dev = interface_to_usbdev(intf);
|
||||
struct wacom *wacom;
|
||||
struct wacom_wac *wacom_wac;
|
||||
struct wacom_features *features;
|
||||
@@ -2766,8 +2767,14 @@ static int wacom_probe(struct hid_device *hdev,
|
||||
wacom_wac->hid_data.inputmode = -1;
|
||||
wacom_wac->mode_report = -1;
|
||||
|
||||
wacom->usbdev = dev;
|
||||
wacom->intf = intf;
|
||||
if (hid_is_usb(hdev)) {
|
||||
struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
|
||||
struct usb_device *dev = interface_to_usbdev(intf);
|
||||
|
||||
wacom->usbdev = dev;
|
||||
wacom->intf = intf;
|
||||
}
|
||||
|
||||
mutex_init(&wacom->lock);
|
||||
INIT_DELAYED_WORK(&wacom->init_work, wacom_init_work);
|
||||
INIT_WORK(&wacom->wireless_work, wacom_wireless_work);
|
||||
|
||||
@@ -8415,6 +8415,8 @@ static void receive_interrupt_common(struct hfi1_ctxtdata *rcd)
|
||||
*/
|
||||
static void __hfi1_rcd_eoi_intr(struct hfi1_ctxtdata *rcd)
|
||||
{
|
||||
if (!rcd->rcvhdrq)
|
||||
return;
|
||||
clear_recv_intr(rcd);
|
||||
if (check_packet_present(rcd))
|
||||
force_recv_intr(rcd);
|
||||
|
||||
@@ -1012,6 +1012,8 @@ int handle_receive_interrupt(struct hfi1_ctxtdata *rcd, int thread)
|
||||
struct hfi1_packet packet;
|
||||
int skip_pkt = 0;
|
||||
|
||||
if (!rcd->rcvhdrq)
|
||||
return RCV_PKT_OK;
|
||||
/* Control context will always use the slow path interrupt handler */
|
||||
needset = (rcd->ctxt == HFI1_CTRL_CTXT) ? 0 : 1;
|
||||
|
||||
|
||||
@@ -113,7 +113,6 @@ static int hfi1_create_kctxt(struct hfi1_devdata *dd,
|
||||
rcd->fast_handler = get_dma_rtail_setting(rcd) ?
|
||||
handle_receive_interrupt_dma_rtail :
|
||||
handle_receive_interrupt_nodma_rtail;
|
||||
rcd->slow_handler = handle_receive_interrupt;
|
||||
|
||||
hfi1_set_seq_cnt(rcd, 1);
|
||||
|
||||
@@ -334,6 +333,8 @@ int hfi1_create_ctxtdata(struct hfi1_pportdata *ppd, int numa,
|
||||
rcd->numa_id = numa;
|
||||
rcd->rcv_array_groups = dd->rcv_entries.ngroups;
|
||||
rcd->rhf_rcv_function_map = normal_rhf_rcv_functions;
|
||||
rcd->slow_handler = handle_receive_interrupt;
|
||||
rcd->do_interrupt = rcd->slow_handler;
|
||||
rcd->msix_intr = CCE_NUM_MSIX_VECTORS;
|
||||
|
||||
mutex_init(&rcd->exp_mutex);
|
||||
@@ -874,18 +875,6 @@ int hfi1_init(struct hfi1_devdata *dd, int reinit)
|
||||
if (ret)
|
||||
goto done;
|
||||
|
||||
/* allocate dummy tail memory for all receive contexts */
|
||||
dd->rcvhdrtail_dummy_kvaddr = dma_alloc_coherent(&dd->pcidev->dev,
|
||||
sizeof(u64),
|
||||
&dd->rcvhdrtail_dummy_dma,
|
||||
GFP_KERNEL);
|
||||
|
||||
if (!dd->rcvhdrtail_dummy_kvaddr) {
|
||||
dd_dev_err(dd, "cannot allocate dummy tail memory\n");
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* dd->rcd can be NULL if early initialization failed */
|
||||
for (i = 0; dd->rcd && i < dd->first_dyn_alloc_ctxt; ++i) {
|
||||
/*
|
||||
@@ -898,8 +887,6 @@ int hfi1_init(struct hfi1_devdata *dd, int reinit)
|
||||
if (!rcd)
|
||||
continue;
|
||||
|
||||
rcd->do_interrupt = &handle_receive_interrupt;
|
||||
|
||||
lastfail = hfi1_create_rcvhdrq(dd, rcd);
|
||||
if (!lastfail)
|
||||
lastfail = hfi1_setup_eagerbufs(rcd);
|
||||
@@ -1120,7 +1107,7 @@ void hfi1_free_ctxtdata(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd)
|
||||
rcd->egrbufs.rcvtids = NULL;
|
||||
|
||||
for (e = 0; e < rcd->egrbufs.alloced; e++) {
|
||||
if (rcd->egrbufs.buffers[e].dma)
|
||||
if (rcd->egrbufs.buffers[e].addr)
|
||||
dma_free_coherent(&dd->pcidev->dev,
|
||||
rcd->egrbufs.buffers[e].len,
|
||||
rcd->egrbufs.buffers[e].addr,
|
||||
@@ -1201,6 +1188,11 @@ void hfi1_free_devdata(struct hfi1_devdata *dd)
|
||||
dd->tx_opstats = NULL;
|
||||
kfree(dd->comp_vect);
|
||||
dd->comp_vect = NULL;
|
||||
if (dd->rcvhdrtail_dummy_kvaddr)
|
||||
dma_free_coherent(&dd->pcidev->dev, sizeof(u64),
|
||||
(void *)dd->rcvhdrtail_dummy_kvaddr,
|
||||
dd->rcvhdrtail_dummy_dma);
|
||||
dd->rcvhdrtail_dummy_kvaddr = NULL;
|
||||
sdma_clean(dd, dd->num_sdma);
|
||||
rvt_dealloc_device(&dd->verbs_dev.rdi);
|
||||
}
|
||||
@@ -1298,6 +1290,15 @@ static struct hfi1_devdata *hfi1_alloc_devdata(struct pci_dev *pdev,
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/* allocate dummy tail memory for all receive contexts */
|
||||
dd->rcvhdrtail_dummy_kvaddr =
|
||||
dma_alloc_coherent(&dd->pcidev->dev, sizeof(u64),
|
||||
&dd->rcvhdrtail_dummy_dma, GFP_KERNEL);
|
||||
if (!dd->rcvhdrtail_dummy_kvaddr) {
|
||||
ret = -ENOMEM;
|
||||
goto bail;
|
||||
}
|
||||
|
||||
atomic_set(&dd->ipoib_rsm_usr_num, 0);
|
||||
return dd;
|
||||
|
||||
@@ -1505,13 +1506,6 @@ static void cleanup_device_data(struct hfi1_devdata *dd)
|
||||
|
||||
free_credit_return(dd);
|
||||
|
||||
if (dd->rcvhdrtail_dummy_kvaddr) {
|
||||
dma_free_coherent(&dd->pcidev->dev, sizeof(u64),
|
||||
(void *)dd->rcvhdrtail_dummy_kvaddr,
|
||||
dd->rcvhdrtail_dummy_dma);
|
||||
dd->rcvhdrtail_dummy_kvaddr = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Free any resources still in use (usually just kernel contexts)
|
||||
* at unload; we do for ctxtcnt, because that's what we allocate.
|
||||
|
||||
@@ -838,8 +838,8 @@ struct sdma_engine *sdma_select_user_engine(struct hfi1_devdata *dd,
|
||||
if (current->nr_cpus_allowed != 1)
|
||||
goto out;
|
||||
|
||||
cpu_id = smp_processor_id();
|
||||
rcu_read_lock();
|
||||
cpu_id = smp_processor_id();
|
||||
rht_node = rhashtable_lookup(dd->sdma_rht, &cpu_id,
|
||||
sdma_rht_params);
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <net/addrconf.h>
|
||||
@@ -1050,9 +1051,14 @@ static u32 hns_roce_v2_cmd_hw_resetting(struct hns_roce_dev *hr_dev,
|
||||
unsigned long instance_stage,
|
||||
unsigned long reset_stage)
|
||||
{
|
||||
#define HW_RESET_TIMEOUT_US 1000000
|
||||
#define HW_RESET_SLEEP_US 1000
|
||||
|
||||
struct hns_roce_v2_priv *priv = hr_dev->priv;
|
||||
struct hnae3_handle *handle = priv->handle;
|
||||
const struct hnae3_ae_ops *ops = handle->ae_algo->ops;
|
||||
unsigned long val;
|
||||
int ret;
|
||||
|
||||
/* When hardware reset is detected, we should stop sending mailbox&cmq&
|
||||
* doorbell to hardware. If now in .init_instance() function, we should
|
||||
@@ -1064,7 +1070,11 @@ static u32 hns_roce_v2_cmd_hw_resetting(struct hns_roce_dev *hr_dev,
|
||||
* again.
|
||||
*/
|
||||
hr_dev->dis_db = true;
|
||||
if (!ops->get_hw_reset_stat(handle))
|
||||
|
||||
ret = read_poll_timeout(ops->ae_dev_reset_cnt, val,
|
||||
val > hr_dev->reset_cnt, HW_RESET_SLEEP_US,
|
||||
HW_RESET_TIMEOUT_US, false, handle);
|
||||
if (!ret)
|
||||
hr_dev->is_reset = true;
|
||||
|
||||
if (!hr_dev->is_reset || reset_stage == HNS_ROCE_STATE_RST_INIT ||
|
||||
@@ -6387,10 +6397,8 @@ static int hns_roce_hw_v2_reset_notify_down(struct hnae3_handle *handle)
|
||||
if (!hr_dev)
|
||||
return 0;
|
||||
|
||||
hr_dev->is_reset = true;
|
||||
hr_dev->active = false;
|
||||
hr_dev->dis_db = true;
|
||||
|
||||
hr_dev->state = HNS_ROCE_DEVICE_STATE_RST_DOWN;
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -60,6 +60,8 @@ static void irdma_iwarp_ce_handler(struct irdma_sc_cq *iwcq)
|
||||
{
|
||||
struct irdma_cq *cq = iwcq->back_cq;
|
||||
|
||||
if (!cq->user_mode)
|
||||
cq->armed = false;
|
||||
if (cq->ibcq.comp_handler)
|
||||
cq->ibcq.comp_handler(&cq->ibcq, cq->ibcq.cq_context);
|
||||
}
|
||||
@@ -146,6 +148,7 @@ static void irdma_set_flush_fields(struct irdma_sc_qp *qp,
|
||||
qp->flush_code = FLUSH_PROT_ERR;
|
||||
break;
|
||||
case IRDMA_AE_AMP_BAD_QP:
|
||||
case IRDMA_AE_WQE_UNEXPECTED_OPCODE:
|
||||
qp->flush_code = FLUSH_LOC_QP_OP_ERR;
|
||||
break;
|
||||
case IRDMA_AE_AMP_BAD_STAG_KEY:
|
||||
@@ -156,7 +159,6 @@ static void irdma_set_flush_fields(struct irdma_sc_qp *qp,
|
||||
case IRDMA_AE_PRIV_OPERATION_DENIED:
|
||||
case IRDMA_AE_IB_INVALID_REQUEST:
|
||||
case IRDMA_AE_IB_REMOTE_ACCESS_ERROR:
|
||||
case IRDMA_AE_IB_REMOTE_OP_ERROR:
|
||||
qp->flush_code = FLUSH_REM_ACCESS_ERR;
|
||||
qp->event_type = IRDMA_QP_EVENT_ACCESS_ERR;
|
||||
break;
|
||||
@@ -184,6 +186,9 @@ static void irdma_set_flush_fields(struct irdma_sc_qp *qp,
|
||||
case IRDMA_AE_AMP_MWBIND_INVALID_BOUNDS:
|
||||
qp->flush_code = FLUSH_MW_BIND_ERR;
|
||||
break;
|
||||
case IRDMA_AE_IB_REMOTE_OP_ERROR:
|
||||
qp->flush_code = FLUSH_REM_OP_ERR;
|
||||
break;
|
||||
default:
|
||||
qp->flush_code = FLUSH_FATAL_ERR;
|
||||
break;
|
||||
|
||||
@@ -542,6 +542,7 @@ int irdma_ah_cqp_op(struct irdma_pci_f *rf, struct irdma_sc_ah *sc_ah, u8 cmd,
|
||||
void (*callback_fcn)(struct irdma_cqp_request *cqp_request),
|
||||
void *cb_param);
|
||||
void irdma_gsi_ud_qp_ah_cb(struct irdma_cqp_request *cqp_request);
|
||||
bool irdma_cq_empty(struct irdma_cq *iwcq);
|
||||
int irdma_inetaddr_event(struct notifier_block *notifier, unsigned long event,
|
||||
void *ptr);
|
||||
int irdma_inet6addr_event(struct notifier_block *notifier, unsigned long event,
|
||||
|
||||
@@ -25,8 +25,7 @@ void irdma_destroy_pble_prm(struct irdma_hmc_pble_rsrc *pble_rsrc)
|
||||
list_del(&chunk->list);
|
||||
if (chunk->type == PBLE_SD_PAGED)
|
||||
irdma_pble_free_paged_mem(chunk);
|
||||
if (chunk->bitmapbuf)
|
||||
kfree(chunk->bitmapmem.va);
|
||||
bitmap_free(chunk->bitmapbuf);
|
||||
kfree(chunk->chunkmem.va);
|
||||
}
|
||||
}
|
||||
@@ -283,7 +282,6 @@ add_pble_prm(struct irdma_hmc_pble_rsrc *pble_rsrc)
|
||||
"PBLE: next_fpm_addr = %llx chunk_size[%llu] = 0x%llx\n",
|
||||
pble_rsrc->next_fpm_addr, chunk->size, chunk->size);
|
||||
pble_rsrc->unallocated_pble -= (u32)(chunk->size >> 3);
|
||||
list_add(&chunk->list, &pble_rsrc->pinfo.clist);
|
||||
sd_reg_val = (sd_entry_type == IRDMA_SD_TYPE_PAGED) ?
|
||||
sd_entry->u.pd_table.pd_page_addr.pa :
|
||||
sd_entry->u.bp.addr.pa;
|
||||
@@ -295,12 +293,12 @@ add_pble_prm(struct irdma_hmc_pble_rsrc *pble_rsrc)
|
||||
goto error;
|
||||
}
|
||||
|
||||
list_add(&chunk->list, &pble_rsrc->pinfo.clist);
|
||||
sd_entry->valid = true;
|
||||
return 0;
|
||||
|
||||
error:
|
||||
if (chunk->bitmapbuf)
|
||||
kfree(chunk->bitmapmem.va);
|
||||
bitmap_free(chunk->bitmapbuf);
|
||||
kfree(chunk->chunkmem.va);
|
||||
|
||||
return ret_code;
|
||||
|
||||
@@ -78,7 +78,6 @@ struct irdma_chunk {
|
||||
u32 pg_cnt;
|
||||
enum irdma_alloc_type type;
|
||||
struct irdma_sc_dev *dev;
|
||||
struct irdma_virt_mem bitmapmem;
|
||||
struct irdma_virt_mem chunkmem;
|
||||
};
|
||||
|
||||
|
||||
@@ -2239,15 +2239,10 @@ enum irdma_status_code irdma_prm_add_pble_mem(struct irdma_pble_prm *pprm,
|
||||
|
||||
sizeofbitmap = (u64)pchunk->size >> pprm->pble_shift;
|
||||
|
||||
pchunk->bitmapmem.size = sizeofbitmap >> 3;
|
||||
pchunk->bitmapmem.va = kzalloc(pchunk->bitmapmem.size, GFP_KERNEL);
|
||||
|
||||
if (!pchunk->bitmapmem.va)
|
||||
pchunk->bitmapbuf = bitmap_zalloc(sizeofbitmap, GFP_KERNEL);
|
||||
if (!pchunk->bitmapbuf)
|
||||
return IRDMA_ERR_NO_MEMORY;
|
||||
|
||||
pchunk->bitmapbuf = pchunk->bitmapmem.va;
|
||||
bitmap_zero(pchunk->bitmapbuf, sizeofbitmap);
|
||||
|
||||
pchunk->sizeofbitmap = sizeofbitmap;
|
||||
/* each pble is 8 bytes hence shift by 3 */
|
||||
pprm->total_pble_alloc += pchunk->size >> 3;
|
||||
@@ -2491,3 +2486,18 @@ void irdma_ib_qp_event(struct irdma_qp *iwqp, enum irdma_qp_event_type event)
|
||||
ibevent.element.qp = &iwqp->ibqp;
|
||||
iwqp->ibqp.event_handler(&ibevent, iwqp->ibqp.qp_context);
|
||||
}
|
||||
|
||||
bool irdma_cq_empty(struct irdma_cq *iwcq)
|
||||
{
|
||||
struct irdma_cq_uk *ukcq;
|
||||
u64 qword3;
|
||||
__le64 *cqe;
|
||||
u8 polarity;
|
||||
|
||||
ukcq = &iwcq->sc_cq.cq_uk;
|
||||
cqe = IRDMA_GET_CURRENT_CQ_ELEM(ukcq);
|
||||
get_64bit_val(cqe, 24, &qword3);
|
||||
polarity = (u8)FIELD_GET(IRDMA_CQ_VALID, qword3);
|
||||
|
||||
return polarity != ukcq->polarity;
|
||||
}
|
||||
|
||||
@@ -3584,18 +3584,31 @@ static int irdma_req_notify_cq(struct ib_cq *ibcq,
|
||||
struct irdma_cq *iwcq;
|
||||
struct irdma_cq_uk *ukcq;
|
||||
unsigned long flags;
|
||||
enum irdma_cmpl_notify cq_notify = IRDMA_CQ_COMPL_EVENT;
|
||||
enum irdma_cmpl_notify cq_notify;
|
||||
bool promo_event = false;
|
||||
int ret = 0;
|
||||
|
||||
cq_notify = notify_flags == IB_CQ_SOLICITED ?
|
||||
IRDMA_CQ_COMPL_SOLICITED : IRDMA_CQ_COMPL_EVENT;
|
||||
iwcq = to_iwcq(ibcq);
|
||||
ukcq = &iwcq->sc_cq.cq_uk;
|
||||
if (notify_flags == IB_CQ_SOLICITED)
|
||||
cq_notify = IRDMA_CQ_COMPL_SOLICITED;
|
||||
|
||||
spin_lock_irqsave(&iwcq->lock, flags);
|
||||
irdma_uk_cq_request_notification(ukcq, cq_notify);
|
||||
/* Only promote to arm the CQ for any event if the last arm event was solicited. */
|
||||
if (iwcq->last_notify == IRDMA_CQ_COMPL_SOLICITED && notify_flags != IB_CQ_SOLICITED)
|
||||
promo_event = true;
|
||||
|
||||
if (!iwcq->armed || promo_event) {
|
||||
iwcq->armed = true;
|
||||
iwcq->last_notify = cq_notify;
|
||||
irdma_uk_cq_request_notification(ukcq, cq_notify);
|
||||
}
|
||||
|
||||
if ((notify_flags & IB_CQ_REPORT_MISSED_EVENTS) && !irdma_cq_empty(iwcq))
|
||||
ret = 1;
|
||||
spin_unlock_irqrestore(&iwcq->lock, flags);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int irdma_roce_port_immutable(struct ib_device *ibdev, u32 port_num,
|
||||
|
||||
@@ -110,6 +110,8 @@ struct irdma_cq {
|
||||
u16 cq_size;
|
||||
u16 cq_num;
|
||||
bool user_mode;
|
||||
bool armed;
|
||||
enum irdma_cmpl_notify last_notify;
|
||||
u32 polled_cmpls;
|
||||
u32 cq_mem_size;
|
||||
struct irdma_dma_mem kmem;
|
||||
|
||||
@@ -664,7 +664,6 @@ struct mlx5_ib_mr {
|
||||
|
||||
/* User MR data */
|
||||
struct mlx5_cache_ent *cache_ent;
|
||||
struct ib_umem *umem;
|
||||
|
||||
/* This is zero'd when the MR is allocated */
|
||||
union {
|
||||
@@ -676,7 +675,7 @@ struct mlx5_ib_mr {
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
/* Used only by kernel MRs (umem == NULL) */
|
||||
/* Used only by kernel MRs */
|
||||
struct {
|
||||
void *descs;
|
||||
void *descs_alloc;
|
||||
@@ -697,8 +696,9 @@ struct mlx5_ib_mr {
|
||||
int data_length;
|
||||
};
|
||||
|
||||
/* Used only by User MRs (umem != NULL) */
|
||||
/* Used only by User MRs */
|
||||
struct {
|
||||
struct ib_umem *umem;
|
||||
unsigned int page_shift;
|
||||
/* Current access_flags */
|
||||
int access_flags;
|
||||
|
||||
@@ -1904,19 +1904,18 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
mlx5_free_priv_descs(struct mlx5_ib_mr *mr)
|
||||
static void mlx5_free_priv_descs(struct mlx5_ib_mr *mr)
|
||||
{
|
||||
if (!mr->umem && mr->descs) {
|
||||
struct ib_device *device = mr->ibmr.device;
|
||||
int size = mr->max_descs * mr->desc_size;
|
||||
struct mlx5_ib_dev *dev = to_mdev(device);
|
||||
struct mlx5_ib_dev *dev = to_mdev(mr->ibmr.device);
|
||||
int size = mr->max_descs * mr->desc_size;
|
||||
|
||||
dma_unmap_single(&dev->mdev->pdev->dev, mr->desc_map, size,
|
||||
DMA_TO_DEVICE);
|
||||
kfree(mr->descs_alloc);
|
||||
mr->descs = NULL;
|
||||
}
|
||||
if (!mr->descs)
|
||||
return;
|
||||
|
||||
dma_unmap_single(&dev->mdev->pdev->dev, mr->desc_map, size,
|
||||
DMA_TO_DEVICE);
|
||||
kfree(mr->descs_alloc);
|
||||
mr->descs = NULL;
|
||||
}
|
||||
|
||||
int mlx5_ib_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
|
||||
@@ -1992,7 +1991,8 @@ int mlx5_ib_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
|
||||
if (mr->cache_ent) {
|
||||
mlx5_mr_cache_free(dev, mr);
|
||||
} else {
|
||||
mlx5_free_priv_descs(mr);
|
||||
if (!udata)
|
||||
mlx5_free_priv_descs(mr);
|
||||
kfree(mr);
|
||||
}
|
||||
return 0;
|
||||
@@ -2079,7 +2079,6 @@ static struct mlx5_ib_mr *mlx5_ib_alloc_pi_mr(struct ib_pd *pd,
|
||||
if (err)
|
||||
goto err_free_in;
|
||||
|
||||
mr->umem = NULL;
|
||||
kfree(in);
|
||||
|
||||
return mr;
|
||||
@@ -2206,7 +2205,6 @@ static struct ib_mr *__mlx5_ib_alloc_mr(struct ib_pd *pd,
|
||||
}
|
||||
|
||||
mr->ibmr.device = pd->device;
|
||||
mr->umem = NULL;
|
||||
|
||||
switch (mr_type) {
|
||||
case IB_MR_TYPE_MEM_REG:
|
||||
|
||||
@@ -359,6 +359,7 @@ int rxe_qp_from_init(struct rxe_dev *rxe, struct rxe_qp *qp, struct rxe_pd *pd,
|
||||
|
||||
err2:
|
||||
rxe_queue_cleanup(qp->sq.queue);
|
||||
qp->sq.queue = NULL;
|
||||
err1:
|
||||
qp->pd = NULL;
|
||||
qp->rcq = NULL;
|
||||
|
||||
@@ -19,7 +19,7 @@ void rtrs_clt_update_wc_stats(struct rtrs_clt_con *con)
|
||||
int cpu;
|
||||
|
||||
cpu = raw_smp_processor_id();
|
||||
s = this_cpu_ptr(stats->pcpu_stats);
|
||||
s = get_cpu_ptr(stats->pcpu_stats);
|
||||
if (con->cpu != cpu) {
|
||||
s->cpu_migr.to++;
|
||||
|
||||
@@ -27,14 +27,16 @@ void rtrs_clt_update_wc_stats(struct rtrs_clt_con *con)
|
||||
s = per_cpu_ptr(stats->pcpu_stats, con->cpu);
|
||||
atomic_inc(&s->cpu_migr.from);
|
||||
}
|
||||
put_cpu_ptr(stats->pcpu_stats);
|
||||
}
|
||||
|
||||
void rtrs_clt_inc_failover_cnt(struct rtrs_clt_stats *stats)
|
||||
{
|
||||
struct rtrs_clt_stats_pcpu *s;
|
||||
|
||||
s = this_cpu_ptr(stats->pcpu_stats);
|
||||
s = get_cpu_ptr(stats->pcpu_stats);
|
||||
s->rdma.failover_cnt++;
|
||||
put_cpu_ptr(stats->pcpu_stats);
|
||||
}
|
||||
|
||||
int rtrs_clt_stats_migration_from_cnt_to_str(struct rtrs_clt_stats *stats, char *buf)
|
||||
@@ -169,9 +171,10 @@ static inline void rtrs_clt_update_rdma_stats(struct rtrs_clt_stats *stats,
|
||||
{
|
||||
struct rtrs_clt_stats_pcpu *s;
|
||||
|
||||
s = this_cpu_ptr(stats->pcpu_stats);
|
||||
s = get_cpu_ptr(stats->pcpu_stats);
|
||||
s->rdma.dir[d].cnt++;
|
||||
s->rdma.dir[d].size_total += size;
|
||||
put_cpu_ptr(stats->pcpu_stats);
|
||||
}
|
||||
|
||||
void rtrs_clt_update_all_stats(struct rtrs_clt_io_req *req, int dir)
|
||||
|
||||
@@ -96,6 +96,13 @@ struct dataflash {
|
||||
struct mtd_info mtd;
|
||||
};
|
||||
|
||||
static const struct spi_device_id dataflash_dev_ids[] = {
|
||||
{ "at45" },
|
||||
{ "dataflash" },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(spi, dataflash_dev_ids);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id dataflash_dt_ids[] = {
|
||||
{ .compatible = "atmel,at45", },
|
||||
@@ -927,6 +934,7 @@ static struct spi_driver dataflash_driver = {
|
||||
.name = "mtd_dataflash",
|
||||
.of_match_table = of_match_ptr(dataflash_dt_ids),
|
||||
},
|
||||
.id_table = dataflash_dev_ids,
|
||||
|
||||
.probe = dataflash_probe,
|
||||
.remove = dataflash_remove,
|
||||
|
||||
@@ -26,7 +26,7 @@ config MTD_NAND_DENALI_PCI
|
||||
config MTD_NAND_DENALI_DT
|
||||
tristate "Denali NAND controller as a DT device"
|
||||
select MTD_NAND_DENALI
|
||||
depends on HAS_DMA && HAVE_CLK && OF
|
||||
depends on HAS_DMA && HAVE_CLK && OF && HAS_IOMEM
|
||||
help
|
||||
Enable the driver for NAND flash on platforms using a Denali NAND
|
||||
controller as a DT device.
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/dma-direction.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
@@ -93,6 +94,14 @@
|
||||
|
||||
#define FSMC_BUSY_WAIT_TIMEOUT (1 * HZ)
|
||||
|
||||
/*
|
||||
* According to SPEAr300 Reference Manual (RM0082)
|
||||
* TOUDEL = 7ns (Output delay from the flip-flops to the board)
|
||||
* TINDEL = 5ns (Input delay from the board to the flipflop)
|
||||
*/
|
||||
#define TOUTDEL 7000
|
||||
#define TINDEL 5000
|
||||
|
||||
struct fsmc_nand_timings {
|
||||
u8 tclr;
|
||||
u8 tar;
|
||||
@@ -277,7 +286,7 @@ static int fsmc_calc_timings(struct fsmc_nand_data *host,
|
||||
{
|
||||
unsigned long hclk = clk_get_rate(host->clk);
|
||||
unsigned long hclkn = NSEC_PER_SEC / hclk;
|
||||
u32 thiz, thold, twait, tset;
|
||||
u32 thiz, thold, twait, tset, twait_min;
|
||||
|
||||
if (sdrt->tRC_min < 30000)
|
||||
return -EOPNOTSUPP;
|
||||
@@ -309,13 +318,6 @@ static int fsmc_calc_timings(struct fsmc_nand_data *host,
|
||||
else if (tims->thold > FSMC_THOLD_MASK)
|
||||
tims->thold = FSMC_THOLD_MASK;
|
||||
|
||||
twait = max(sdrt->tRP_min, sdrt->tWP_min);
|
||||
tims->twait = DIV_ROUND_UP(twait / 1000, hclkn) - 1;
|
||||
if (tims->twait == 0)
|
||||
tims->twait = 1;
|
||||
else if (tims->twait > FSMC_TWAIT_MASK)
|
||||
tims->twait = FSMC_TWAIT_MASK;
|
||||
|
||||
tset = max(sdrt->tCS_min - sdrt->tWP_min,
|
||||
sdrt->tCEA_max - sdrt->tREA_max);
|
||||
tims->tset = DIV_ROUND_UP(tset / 1000, hclkn) - 1;
|
||||
@@ -324,6 +326,21 @@ static int fsmc_calc_timings(struct fsmc_nand_data *host,
|
||||
else if (tims->tset > FSMC_TSET_MASK)
|
||||
tims->tset = FSMC_TSET_MASK;
|
||||
|
||||
/*
|
||||
* According to SPEAr300 Reference Manual (RM0082) which gives more
|
||||
* information related to FSMSC timings than the SPEAr600 one (RM0305),
|
||||
* twait >= tCEA - (tset * TCLK) + TOUTDEL + TINDEL
|
||||
*/
|
||||
twait_min = sdrt->tCEA_max - ((tims->tset + 1) * hclkn * 1000)
|
||||
+ TOUTDEL + TINDEL;
|
||||
twait = max3(sdrt->tRP_min, sdrt->tWP_min, twait_min);
|
||||
|
||||
tims->twait = DIV_ROUND_UP(twait / 1000, hclkn) - 1;
|
||||
if (tims->twait == 0)
|
||||
tims->twait = 1;
|
||||
else if (tims->twait > FSMC_TWAIT_MASK)
|
||||
tims->twait = FSMC_TWAIT_MASK;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -664,6 +681,9 @@ static int fsmc_exec_op(struct nand_chip *chip, const struct nand_operation *op,
|
||||
instr->ctx.waitrdy.timeout_ms);
|
||||
break;
|
||||
}
|
||||
|
||||
if (instr->delay_ns)
|
||||
ndelay(instr->delay_ns);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -926,7 +926,7 @@ int nand_choose_best_sdr_timings(struct nand_chip *chip,
|
||||
struct nand_sdr_timings *spec_timings)
|
||||
{
|
||||
const struct nand_controller_ops *ops = chip->controller->ops;
|
||||
int best_mode = 0, mode, ret;
|
||||
int best_mode = 0, mode, ret = -EOPNOTSUPP;
|
||||
|
||||
iface->type = NAND_SDR_IFACE;
|
||||
|
||||
@@ -977,7 +977,7 @@ int nand_choose_best_nvddr_timings(struct nand_chip *chip,
|
||||
struct nand_nvddr_timings *spec_timings)
|
||||
{
|
||||
const struct nand_controller_ops *ops = chip->controller->ops;
|
||||
int best_mode = 0, mode, ret;
|
||||
int best_mode = 0, mode, ret = -EOPNOTSUPP;
|
||||
|
||||
iface->type = NAND_NVDDR_IFACE;
|
||||
|
||||
@@ -1837,7 +1837,7 @@ int nand_erase_op(struct nand_chip *chip, unsigned int eraseblock)
|
||||
NAND_OP_CMD(NAND_CMD_ERASE1, 0),
|
||||
NAND_OP_ADDR(2, addrs, 0),
|
||||
NAND_OP_CMD(NAND_CMD_ERASE2,
|
||||
NAND_COMMON_TIMING_MS(conf, tWB_max)),
|
||||
NAND_COMMON_TIMING_NS(conf, tWB_max)),
|
||||
NAND_OP_WAIT_RDY(NAND_COMMON_TIMING_MS(conf, tBERS_max),
|
||||
0),
|
||||
};
|
||||
|
||||
@@ -1501,14 +1501,14 @@ void bond_alb_monitor(struct work_struct *work)
|
||||
struct slave *slave;
|
||||
|
||||
if (!bond_has_slaves(bond)) {
|
||||
bond_info->tx_rebalance_counter = 0;
|
||||
atomic_set(&bond_info->tx_rebalance_counter, 0);
|
||||
bond_info->lp_counter = 0;
|
||||
goto re_arm;
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
bond_info->tx_rebalance_counter++;
|
||||
atomic_inc(&bond_info->tx_rebalance_counter);
|
||||
bond_info->lp_counter++;
|
||||
|
||||
/* send learning packets */
|
||||
@@ -1530,7 +1530,7 @@ void bond_alb_monitor(struct work_struct *work)
|
||||
}
|
||||
|
||||
/* rebalance tx traffic */
|
||||
if (bond_info->tx_rebalance_counter >= BOND_TLB_REBALANCE_TICKS) {
|
||||
if (atomic_read(&bond_info->tx_rebalance_counter) >= BOND_TLB_REBALANCE_TICKS) {
|
||||
bond_for_each_slave_rcu(bond, slave, iter) {
|
||||
tlb_clear_slave(bond, slave, 1);
|
||||
if (slave == rcu_access_pointer(bond->curr_active_slave)) {
|
||||
@@ -1540,7 +1540,7 @@ void bond_alb_monitor(struct work_struct *work)
|
||||
bond_info->unbalanced_load = 0;
|
||||
}
|
||||
}
|
||||
bond_info->tx_rebalance_counter = 0;
|
||||
atomic_set(&bond_info->tx_rebalance_counter, 0);
|
||||
}
|
||||
|
||||
if (bond_info->rlb_enabled) {
|
||||
@@ -1610,7 +1610,8 @@ int bond_alb_init_slave(struct bonding *bond, struct slave *slave)
|
||||
tlb_init_slave(slave);
|
||||
|
||||
/* order a rebalance ASAP */
|
||||
bond->alb_info.tx_rebalance_counter = BOND_TLB_REBALANCE_TICKS;
|
||||
atomic_set(&bond->alb_info.tx_rebalance_counter,
|
||||
BOND_TLB_REBALANCE_TICKS);
|
||||
|
||||
if (bond->alb_info.rlb_enabled)
|
||||
bond->alb_info.rlb_rebalance = 1;
|
||||
@@ -1647,7 +1648,8 @@ void bond_alb_handle_link_change(struct bonding *bond, struct slave *slave, char
|
||||
rlb_clear_slave(bond, slave);
|
||||
} else if (link == BOND_LINK_UP) {
|
||||
/* order a rebalance ASAP */
|
||||
bond_info->tx_rebalance_counter = BOND_TLB_REBALANCE_TICKS;
|
||||
atomic_set(&bond_info->tx_rebalance_counter,
|
||||
BOND_TLB_REBALANCE_TICKS);
|
||||
if (bond->alb_info.rlb_enabled) {
|
||||
bond->alb_info.rlb_rebalance = 1;
|
||||
/* If the updelay module parameter is smaller than the
|
||||
|
||||
@@ -248,6 +248,9 @@ MODULE_DESCRIPTION("CAN driver for Kvaser CAN/PCIe devices");
|
||||
#define KVASER_PCIEFD_SPACK_EWLR BIT(23)
|
||||
#define KVASER_PCIEFD_SPACK_EPLR BIT(24)
|
||||
|
||||
/* Kvaser KCAN_EPACK second word */
|
||||
#define KVASER_PCIEFD_EPACK_DIR_TX BIT(0)
|
||||
|
||||
struct kvaser_pciefd;
|
||||
|
||||
struct kvaser_pciefd_can {
|
||||
@@ -1285,7 +1288,10 @@ static int kvaser_pciefd_rx_error_frame(struct kvaser_pciefd_can *can,
|
||||
|
||||
can->err_rep_cnt++;
|
||||
can->can.can_stats.bus_error++;
|
||||
stats->rx_errors++;
|
||||
if (p->header[1] & KVASER_PCIEFD_EPACK_DIR_TX)
|
||||
stats->tx_errors++;
|
||||
else
|
||||
stats->rx_errors++;
|
||||
|
||||
can->bec.txerr = bec.txerr;
|
||||
can->bec.rxerr = bec.rxerr;
|
||||
|
||||
@@ -204,16 +204,16 @@ enum m_can_reg {
|
||||
|
||||
/* Interrupts for version 3.0.x */
|
||||
#define IR_ERR_LEC_30X (IR_STE | IR_FOE | IR_ACKE | IR_BE | IR_CRCE)
|
||||
#define IR_ERR_BUS_30X (IR_ERR_LEC_30X | IR_WDI | IR_ELO | IR_BEU | \
|
||||
IR_BEC | IR_TOO | IR_MRAF | IR_TSW | IR_TEFL | \
|
||||
IR_RF1L | IR_RF0L)
|
||||
#define IR_ERR_BUS_30X (IR_ERR_LEC_30X | IR_WDI | IR_BEU | IR_BEC | \
|
||||
IR_TOO | IR_MRAF | IR_TSW | IR_TEFL | IR_RF1L | \
|
||||
IR_RF0L)
|
||||
#define IR_ERR_ALL_30X (IR_ERR_STATE | IR_ERR_BUS_30X)
|
||||
|
||||
/* Interrupts for version >= 3.1.x */
|
||||
#define IR_ERR_LEC_31X (IR_PED | IR_PEA)
|
||||
#define IR_ERR_BUS_31X (IR_ERR_LEC_31X | IR_WDI | IR_ELO | IR_BEU | \
|
||||
IR_BEC | IR_TOO | IR_MRAF | IR_TSW | IR_TEFL | \
|
||||
IR_RF1L | IR_RF0L)
|
||||
#define IR_ERR_BUS_31X (IR_ERR_LEC_31X | IR_WDI | IR_BEU | IR_BEC | \
|
||||
IR_TOO | IR_MRAF | IR_TSW | IR_TEFL | IR_RF1L | \
|
||||
IR_RF0L)
|
||||
#define IR_ERR_ALL_31X (IR_ERR_STATE | IR_ERR_BUS_31X)
|
||||
|
||||
/* Interrupt Line Select (ILS) */
|
||||
@@ -517,7 +517,7 @@ static int m_can_read_fifo(struct net_device *dev, u32 rxfs)
|
||||
err = m_can_fifo_read(cdev, fgi, M_CAN_FIFO_DATA,
|
||||
cf->data, DIV_ROUND_UP(cf->len, 4));
|
||||
if (err)
|
||||
goto out_fail;
|
||||
goto out_free_skb;
|
||||
}
|
||||
|
||||
/* acknowledge rx fifo 0 */
|
||||
@@ -532,6 +532,8 @@ static int m_can_read_fifo(struct net_device *dev, u32 rxfs)
|
||||
|
||||
return 0;
|
||||
|
||||
out_free_skb:
|
||||
kfree_skb(skb);
|
||||
out_fail:
|
||||
netdev_err(dev, "FIFO read returned %d\n", err);
|
||||
return err;
|
||||
@@ -810,8 +812,6 @@ static void m_can_handle_other_err(struct net_device *dev, u32 irqstatus)
|
||||
{
|
||||
if (irqstatus & IR_WDI)
|
||||
netdev_err(dev, "Message RAM Watchdog event due to missing READY\n");
|
||||
if (irqstatus & IR_ELO)
|
||||
netdev_err(dev, "Error Logging Overflow\n");
|
||||
if (irqstatus & IR_BEU)
|
||||
netdev_err(dev, "Bit Error Uncorrected\n");
|
||||
if (irqstatus & IR_BEC)
|
||||
@@ -1494,20 +1494,32 @@ static int m_can_dev_setup(struct m_can_classdev *cdev)
|
||||
case 30:
|
||||
/* CAN_CTRLMODE_FD_NON_ISO is fixed with M_CAN IP v3.0.x */
|
||||
can_set_static_ctrlmode(dev, CAN_CTRLMODE_FD_NON_ISO);
|
||||
cdev->can.bittiming_const = &m_can_bittiming_const_30X;
|
||||
cdev->can.data_bittiming_const = &m_can_data_bittiming_const_30X;
|
||||
cdev->can.bittiming_const = cdev->bit_timing ?
|
||||
cdev->bit_timing : &m_can_bittiming_const_30X;
|
||||
|
||||
cdev->can.data_bittiming_const = cdev->data_timing ?
|
||||
cdev->data_timing :
|
||||
&m_can_data_bittiming_const_30X;
|
||||
break;
|
||||
case 31:
|
||||
/* CAN_CTRLMODE_FD_NON_ISO is fixed with M_CAN IP v3.1.x */
|
||||
can_set_static_ctrlmode(dev, CAN_CTRLMODE_FD_NON_ISO);
|
||||
cdev->can.bittiming_const = &m_can_bittiming_const_31X;
|
||||
cdev->can.data_bittiming_const = &m_can_data_bittiming_const_31X;
|
||||
cdev->can.bittiming_const = cdev->bit_timing ?
|
||||
cdev->bit_timing : &m_can_bittiming_const_31X;
|
||||
|
||||
cdev->can.data_bittiming_const = cdev->data_timing ?
|
||||
cdev->data_timing :
|
||||
&m_can_data_bittiming_const_31X;
|
||||
break;
|
||||
case 32:
|
||||
case 33:
|
||||
/* Support both MCAN version v3.2.x and v3.3.0 */
|
||||
cdev->can.bittiming_const = &m_can_bittiming_const_31X;
|
||||
cdev->can.data_bittiming_const = &m_can_data_bittiming_const_31X;
|
||||
cdev->can.bittiming_const = cdev->bit_timing ?
|
||||
cdev->bit_timing : &m_can_bittiming_const_31X;
|
||||
|
||||
cdev->can.data_bittiming_const = cdev->data_timing ?
|
||||
cdev->data_timing :
|
||||
&m_can_data_bittiming_const_31X;
|
||||
|
||||
cdev->can.ctrlmode_supported |=
|
||||
(m_can_niso_supported(cdev) ?
|
||||
|
||||
@@ -85,6 +85,9 @@ struct m_can_classdev {
|
||||
struct sk_buff *tx_skb;
|
||||
struct phy *transceiver;
|
||||
|
||||
const struct can_bittiming_const *bit_timing;
|
||||
const struct can_bittiming_const *data_timing;
|
||||
|
||||
struct m_can_ops *ops;
|
||||
|
||||
int version;
|
||||
|
||||
@@ -18,9 +18,14 @@
|
||||
|
||||
#define M_CAN_PCI_MMIO_BAR 0
|
||||
|
||||
#define M_CAN_CLOCK_FREQ_EHL 100000000
|
||||
#define CTL_CSR_INT_CTL_OFFSET 0x508
|
||||
|
||||
struct m_can_pci_config {
|
||||
const struct can_bittiming_const *bit_timing;
|
||||
const struct can_bittiming_const *data_timing;
|
||||
unsigned int clock_freq;
|
||||
};
|
||||
|
||||
struct m_can_pci_priv {
|
||||
struct m_can_classdev cdev;
|
||||
|
||||
@@ -42,8 +47,13 @@ static u32 iomap_read_reg(struct m_can_classdev *cdev, int reg)
|
||||
static int iomap_read_fifo(struct m_can_classdev *cdev, int offset, void *val, size_t val_count)
|
||||
{
|
||||
struct m_can_pci_priv *priv = cdev_to_priv(cdev);
|
||||
void __iomem *src = priv->base + offset;
|
||||
|
||||
ioread32_rep(priv->base + offset, val, val_count);
|
||||
while (val_count--) {
|
||||
*(unsigned int *)val = ioread32(src);
|
||||
val += 4;
|
||||
src += 4;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -61,8 +71,13 @@ static int iomap_write_fifo(struct m_can_classdev *cdev, int offset,
|
||||
const void *val, size_t val_count)
|
||||
{
|
||||
struct m_can_pci_priv *priv = cdev_to_priv(cdev);
|
||||
void __iomem *dst = priv->base + offset;
|
||||
|
||||
iowrite32_rep(priv->base + offset, val, val_count);
|
||||
while (val_count--) {
|
||||
iowrite32(*(unsigned int *)val, dst);
|
||||
val += 4;
|
||||
dst += 4;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -74,9 +89,40 @@ static struct m_can_ops m_can_pci_ops = {
|
||||
.read_fifo = iomap_read_fifo,
|
||||
};
|
||||
|
||||
static const struct can_bittiming_const m_can_bittiming_const_ehl = {
|
||||
.name = KBUILD_MODNAME,
|
||||
.tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */
|
||||
.tseg1_max = 64,
|
||||
.tseg2_min = 1, /* Time segment 2 = phase_seg2 */
|
||||
.tseg2_max = 128,
|
||||
.sjw_max = 128,
|
||||
.brp_min = 1,
|
||||
.brp_max = 512,
|
||||
.brp_inc = 1,
|
||||
};
|
||||
|
||||
static const struct can_bittiming_const m_can_data_bittiming_const_ehl = {
|
||||
.name = KBUILD_MODNAME,
|
||||
.tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */
|
||||
.tseg1_max = 16,
|
||||
.tseg2_min = 1, /* Time segment 2 = phase_seg2 */
|
||||
.tseg2_max = 8,
|
||||
.sjw_max = 4,
|
||||
.brp_min = 1,
|
||||
.brp_max = 32,
|
||||
.brp_inc = 1,
|
||||
};
|
||||
|
||||
static const struct m_can_pci_config m_can_pci_ehl = {
|
||||
.bit_timing = &m_can_bittiming_const_ehl,
|
||||
.data_timing = &m_can_data_bittiming_const_ehl,
|
||||
.clock_freq = 200000000,
|
||||
};
|
||||
|
||||
static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
||||
{
|
||||
struct device *dev = &pci->dev;
|
||||
const struct m_can_pci_config *cfg;
|
||||
struct m_can_classdev *mcan_class;
|
||||
struct m_can_pci_priv *priv;
|
||||
void __iomem *base;
|
||||
@@ -104,6 +150,8 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
||||
if (!mcan_class)
|
||||
return -ENOMEM;
|
||||
|
||||
cfg = (const struct m_can_pci_config *)id->driver_data;
|
||||
|
||||
priv = cdev_to_priv(mcan_class);
|
||||
|
||||
priv->base = base;
|
||||
@@ -115,7 +163,9 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
||||
mcan_class->dev = &pci->dev;
|
||||
mcan_class->net->irq = pci_irq_vector(pci, 0);
|
||||
mcan_class->pm_clock_support = 1;
|
||||
mcan_class->can.clock.freq = id->driver_data;
|
||||
mcan_class->bit_timing = cfg->bit_timing;
|
||||
mcan_class->data_timing = cfg->data_timing;
|
||||
mcan_class->can.clock.freq = cfg->clock_freq;
|
||||
mcan_class->ops = &m_can_pci_ops;
|
||||
|
||||
pci_set_drvdata(pci, mcan_class);
|
||||
@@ -168,8 +218,8 @@ static SIMPLE_DEV_PM_OPS(m_can_pci_pm_ops,
|
||||
m_can_pci_suspend, m_can_pci_resume);
|
||||
|
||||
static const struct pci_device_id m_can_pci_id_table[] = {
|
||||
{ PCI_VDEVICE(INTEL, 0x4bc1), M_CAN_CLOCK_FREQ_EHL, },
|
||||
{ PCI_VDEVICE(INTEL, 0x4bc2), M_CAN_CLOCK_FREQ_EHL, },
|
||||
{ PCI_VDEVICE(INTEL, 0x4bc1), (kernel_ulong_t)&m_can_pci_ehl, },
|
||||
{ PCI_VDEVICE(INTEL, 0x4bc2), (kernel_ulong_t)&m_can_pci_ehl, },
|
||||
{ } /* Terminating Entry */
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, m_can_pci_id_table);
|
||||
|
||||
@@ -692,11 +692,11 @@ static int pch_can_rx_normal(struct net_device *ndev, u32 obj_num, int quota)
|
||||
cf->data[i + 1] = data_reg >> 8;
|
||||
}
|
||||
|
||||
netif_receive_skb(skb);
|
||||
rcv_pkts++;
|
||||
stats->rx_packets++;
|
||||
quota--;
|
||||
stats->rx_bytes += cf->len;
|
||||
netif_receive_skb(skb);
|
||||
|
||||
pch_fifo_thresh(priv, obj_num);
|
||||
obj_num++;
|
||||
|
||||
@@ -234,7 +234,12 @@ static int ems_pcmcia_add_card(struct pcmcia_device *pdev, unsigned long base)
|
||||
free_sja1000dev(dev);
|
||||
}
|
||||
|
||||
err = request_irq(dev->irq, &ems_pcmcia_interrupt, IRQF_SHARED,
|
||||
if (!card->channels) {
|
||||
err = -ENODEV;
|
||||
goto failure_cleanup;
|
||||
}
|
||||
|
||||
err = request_irq(pdev->irq, &ems_pcmcia_interrupt, IRQF_SHARED,
|
||||
DRV_NAME, card);
|
||||
if (!err)
|
||||
return 0;
|
||||
|
||||
@@ -28,10 +28,6 @@
|
||||
|
||||
#include "kvaser_usb.h"
|
||||
|
||||
/* Forward declaration */
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg;
|
||||
|
||||
#define CAN_USB_CLOCK 8000000
|
||||
#define MAX_USBCAN_NET_DEVICES 2
|
||||
|
||||
/* Command header size */
|
||||
@@ -80,6 +76,12 @@ static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg;
|
||||
|
||||
#define CMD_LEAF_LOG_MESSAGE 106
|
||||
|
||||
/* Leaf frequency options */
|
||||
#define KVASER_USB_LEAF_SWOPTION_FREQ_MASK 0x60
|
||||
#define KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK 0
|
||||
#define KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK BIT(5)
|
||||
#define KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK BIT(6)
|
||||
|
||||
/* error factors */
|
||||
#define M16C_EF_ACKE BIT(0)
|
||||
#define M16C_EF_CRCE BIT(1)
|
||||
@@ -340,6 +342,50 @@ struct kvaser_usb_err_summary {
|
||||
};
|
||||
};
|
||||
|
||||
static const struct can_bittiming_const kvaser_usb_leaf_bittiming_const = {
|
||||
.name = "kvaser_usb",
|
||||
.tseg1_min = KVASER_USB_TSEG1_MIN,
|
||||
.tseg1_max = KVASER_USB_TSEG1_MAX,
|
||||
.tseg2_min = KVASER_USB_TSEG2_MIN,
|
||||
.tseg2_max = KVASER_USB_TSEG2_MAX,
|
||||
.sjw_max = KVASER_USB_SJW_MAX,
|
||||
.brp_min = KVASER_USB_BRP_MIN,
|
||||
.brp_max = KVASER_USB_BRP_MAX,
|
||||
.brp_inc = KVASER_USB_BRP_INC,
|
||||
};
|
||||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_8mhz = {
|
||||
.clock = {
|
||||
.freq = 8000000,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||
};
|
||||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_16mhz = {
|
||||
.clock = {
|
||||
.freq = 16000000,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||
};
|
||||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_24mhz = {
|
||||
.clock = {
|
||||
.freq = 24000000,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||
};
|
||||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_32mhz = {
|
||||
.clock = {
|
||||
.freq = 32000000,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||
};
|
||||
|
||||
static void *
|
||||
kvaser_usb_leaf_frame_to_cmd(const struct kvaser_usb_net_priv *priv,
|
||||
const struct sk_buff *skb, int *frame_len,
|
||||
@@ -471,6 +517,27 @@ static int kvaser_usb_leaf_send_simple_cmd(const struct kvaser_usb *dev,
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void kvaser_usb_leaf_get_software_info_leaf(struct kvaser_usb *dev,
|
||||
const struct leaf_cmd_softinfo *softinfo)
|
||||
{
|
||||
u32 sw_options = le32_to_cpu(softinfo->sw_options);
|
||||
|
||||
dev->fw_version = le32_to_cpu(softinfo->fw_version);
|
||||
dev->max_tx_urbs = le16_to_cpu(softinfo->max_outstanding_tx);
|
||||
|
||||
switch (sw_options & KVASER_USB_LEAF_SWOPTION_FREQ_MASK) {
|
||||
case KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK:
|
||||
dev->cfg = &kvaser_usb_leaf_dev_cfg_16mhz;
|
||||
break;
|
||||
case KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK:
|
||||
dev->cfg = &kvaser_usb_leaf_dev_cfg_24mhz;
|
||||
break;
|
||||
case KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK:
|
||||
dev->cfg = &kvaser_usb_leaf_dev_cfg_32mhz;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev)
|
||||
{
|
||||
struct kvaser_cmd cmd;
|
||||
@@ -486,14 +553,13 @@ static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev)
|
||||
|
||||
switch (dev->card_data.leaf.family) {
|
||||
case KVASER_LEAF:
|
||||
dev->fw_version = le32_to_cpu(cmd.u.leaf.softinfo.fw_version);
|
||||
dev->max_tx_urbs =
|
||||
le16_to_cpu(cmd.u.leaf.softinfo.max_outstanding_tx);
|
||||
kvaser_usb_leaf_get_software_info_leaf(dev, &cmd.u.leaf.softinfo);
|
||||
break;
|
||||
case KVASER_USBCAN:
|
||||
dev->fw_version = le32_to_cpu(cmd.u.usbcan.softinfo.fw_version);
|
||||
dev->max_tx_urbs =
|
||||
le16_to_cpu(cmd.u.usbcan.softinfo.max_outstanding_tx);
|
||||
dev->cfg = &kvaser_usb_leaf_dev_cfg_8mhz;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1225,24 +1291,11 @@ static int kvaser_usb_leaf_init_card(struct kvaser_usb *dev)
|
||||
{
|
||||
struct kvaser_usb_dev_card_data *card_data = &dev->card_data;
|
||||
|
||||
dev->cfg = &kvaser_usb_leaf_dev_cfg;
|
||||
card_data->ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct can_bittiming_const kvaser_usb_leaf_bittiming_const = {
|
||||
.name = "kvaser_usb",
|
||||
.tseg1_min = KVASER_USB_TSEG1_MIN,
|
||||
.tseg1_max = KVASER_USB_TSEG1_MAX,
|
||||
.tseg2_min = KVASER_USB_TSEG2_MIN,
|
||||
.tseg2_max = KVASER_USB_TSEG2_MAX,
|
||||
.sjw_max = KVASER_USB_SJW_MAX,
|
||||
.brp_min = KVASER_USB_BRP_MIN,
|
||||
.brp_max = KVASER_USB_BRP_MAX,
|
||||
.brp_inc = KVASER_USB_BRP_INC,
|
||||
};
|
||||
|
||||
static int kvaser_usb_leaf_set_bittiming(struct net_device *netdev)
|
||||
{
|
||||
struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
|
||||
@@ -1348,11 +1401,3 @@ const struct kvaser_usb_dev_ops kvaser_usb_leaf_dev_ops = {
|
||||
.dev_read_bulk_callback = kvaser_usb_leaf_read_bulk_callback,
|
||||
.dev_frame_to_cmd = kvaser_usb_leaf_frame_to_cmd,
|
||||
};
|
||||
|
||||
static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg = {
|
||||
.clock = {
|
||||
.freq = CAN_USB_CLOCK,
|
||||
},
|
||||
.timestamp_freq = 1,
|
||||
.bittiming_const = &kvaser_usb_leaf_bittiming_const,
|
||||
};
|
||||
|
||||
@@ -471,6 +471,12 @@ static int mv88e6xxx_port_ppu_updates(struct mv88e6xxx_chip *chip, int port)
|
||||
u16 reg;
|
||||
int err;
|
||||
|
||||
/* The 88e6250 family does not have the PHY detect bit. Instead,
|
||||
* report whether the port is internal.
|
||||
*/
|
||||
if (chip->info->family == MV88E6XXX_FAMILY_6250)
|
||||
return port < chip->info->num_internal_phys;
|
||||
|
||||
err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, ®);
|
||||
if (err) {
|
||||
dev_err(chip->dev,
|
||||
@@ -692,44 +698,48 @@ static void mv88e6xxx_mac_config(struct dsa_switch *ds, int port,
|
||||
{
|
||||
struct mv88e6xxx_chip *chip = ds->priv;
|
||||
struct mv88e6xxx_port *p;
|
||||
int err;
|
||||
int err = 0;
|
||||
|
||||
p = &chip->ports[port];
|
||||
|
||||
/* FIXME: is this the correct test? If we're in fixed mode on an
|
||||
* internal port, why should we process this any different from
|
||||
* PHY mode? On the other hand, the port may be automedia between
|
||||
* an internal PHY and the serdes...
|
||||
*/
|
||||
if ((mode == MLO_AN_PHY) && mv88e6xxx_phy_is_internal(ds, port))
|
||||
return;
|
||||
|
||||
mv88e6xxx_reg_lock(chip);
|
||||
/* In inband mode, the link may come up at any time while the link
|
||||
* is not forced down. Force the link down while we reconfigure the
|
||||
* interface mode.
|
||||
*/
|
||||
if (mode == MLO_AN_INBAND && p->interface != state->interface &&
|
||||
chip->info->ops->port_set_link)
|
||||
chip->info->ops->port_set_link(chip, port, LINK_FORCED_DOWN);
|
||||
|
||||
err = mv88e6xxx_port_config_interface(chip, port, state->interface);
|
||||
if (err && err != -EOPNOTSUPP)
|
||||
goto err_unlock;
|
||||
if (mode != MLO_AN_PHY || !mv88e6xxx_phy_is_internal(ds, port)) {
|
||||
/* In inband mode, the link may come up at any time while the
|
||||
* link is not forced down. Force the link down while we
|
||||
* reconfigure the interface mode.
|
||||
*/
|
||||
if (mode == MLO_AN_INBAND &&
|
||||
p->interface != state->interface &&
|
||||
chip->info->ops->port_set_link)
|
||||
chip->info->ops->port_set_link(chip, port,
|
||||
LINK_FORCED_DOWN);
|
||||
|
||||
err = mv88e6xxx_serdes_pcs_config(chip, port, mode, state->interface,
|
||||
state->advertising);
|
||||
/* FIXME: we should restart negotiation if something changed - which
|
||||
* is something we get if we convert to using phylinks PCS operations.
|
||||
*/
|
||||
if (err > 0)
|
||||
err = 0;
|
||||
err = mv88e6xxx_port_config_interface(chip, port,
|
||||
state->interface);
|
||||
if (err && err != -EOPNOTSUPP)
|
||||
goto err_unlock;
|
||||
|
||||
err = mv88e6xxx_serdes_pcs_config(chip, port, mode,
|
||||
state->interface,
|
||||
state->advertising);
|
||||
/* FIXME: we should restart negotiation if something changed -
|
||||
* which is something we get if we convert to using phylinks
|
||||
* PCS operations.
|
||||
*/
|
||||
if (err > 0)
|
||||
err = 0;
|
||||
}
|
||||
|
||||
/* Undo the forced down state above after completing configuration
|
||||
* irrespective of its state on entry, which allows the link to come up.
|
||||
* irrespective of its state on entry, which allows the link to come
|
||||
* up in the in-band case where there is no separate SERDES. Also
|
||||
* ensure that the link can come up if the PPU is in use and we are
|
||||
* in PHY mode (we treat the PPU as an effective in-band mechanism.)
|
||||
*/
|
||||
if (mode == MLO_AN_INBAND && p->interface != state->interface &&
|
||||
chip->info->ops->port_set_link)
|
||||
if (chip->info->ops->port_set_link &&
|
||||
((mode == MLO_AN_INBAND && p->interface != state->interface) ||
|
||||
(mode == MLO_AN_PHY && mv88e6xxx_port_ppu_updates(chip, port))))
|
||||
chip->info->ops->port_set_link(chip, port, LINK_UNFORCED);
|
||||
|
||||
p->interface = state->interface;
|
||||
@@ -752,11 +762,10 @@ static void mv88e6xxx_mac_link_down(struct dsa_switch *ds, int port,
|
||||
ops = chip->info->ops;
|
||||
|
||||
mv88e6xxx_reg_lock(chip);
|
||||
/* Internal PHYs propagate their configuration directly to the MAC.
|
||||
* External PHYs depend on whether the PPU is enabled for this port.
|
||||
/* Force the link down if we know the port may not be automatically
|
||||
* updated by the switch or if we are using fixed-link mode.
|
||||
*/
|
||||
if (((!mv88e6xxx_phy_is_internal(ds, port) &&
|
||||
!mv88e6xxx_port_ppu_updates(chip, port)) ||
|
||||
if ((!mv88e6xxx_port_ppu_updates(chip, port) ||
|
||||
mode == MLO_AN_FIXED) && ops->port_sync_link)
|
||||
err = ops->port_sync_link(chip, port, mode, false);
|
||||
mv88e6xxx_reg_unlock(chip);
|
||||
@@ -779,11 +788,11 @@ static void mv88e6xxx_mac_link_up(struct dsa_switch *ds, int port,
|
||||
ops = chip->info->ops;
|
||||
|
||||
mv88e6xxx_reg_lock(chip);
|
||||
/* Internal PHYs propagate their configuration directly to the MAC.
|
||||
* External PHYs depend on whether the PPU is enabled for this port.
|
||||
/* Configure and force the link up if we know that the port may not
|
||||
* automatically updated by the switch or if we are using fixed-link
|
||||
* mode.
|
||||
*/
|
||||
if ((!mv88e6xxx_phy_is_internal(ds, port) &&
|
||||
!mv88e6xxx_port_ppu_updates(chip, port)) ||
|
||||
if (!mv88e6xxx_port_ppu_updates(chip, port) ||
|
||||
mode == MLO_AN_FIXED) {
|
||||
/* FIXME: for an automedia port, should we force the link
|
||||
* down here - what if the link comes up due to "other" media
|
||||
|
||||
@@ -830,7 +830,7 @@ int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,
|
||||
bool up)
|
||||
{
|
||||
u8 cmode = chip->ports[port].cmode;
|
||||
int err = 0;
|
||||
int err;
|
||||
|
||||
switch (cmode) {
|
||||
case MV88E6XXX_PORT_STS_CMODE_SGMII:
|
||||
@@ -842,6 +842,9 @@ int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,
|
||||
case MV88E6XXX_PORT_STS_CMODE_RXAUI:
|
||||
err = mv88e6390_serdes_power_10g(chip, lane, up);
|
||||
break;
|
||||
default:
|
||||
err = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!err && up)
|
||||
@@ -1541,6 +1544,9 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,
|
||||
case MV88E6393X_PORT_STS_CMODE_10GBASER:
|
||||
err = mv88e6390_serdes_power_10g(chip, lane, on);
|
||||
break;
|
||||
default:
|
||||
err = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
if (err)
|
||||
|
||||
@@ -290,8 +290,11 @@ static int felix_setup_mmio_filtering(struct felix *felix)
|
||||
}
|
||||
}
|
||||
|
||||
if (cpu < 0)
|
||||
if (cpu < 0) {
|
||||
kfree(tagging_rule);
|
||||
kfree(redirect_rule);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
tagging_rule->key_type = OCELOT_VCAP_KEY_ETYPE;
|
||||
*(__be16 *)tagging_rule->key.etype.etype.value = htons(ETH_P_1588);
|
||||
|
||||
@@ -1430,16 +1430,19 @@ static int altera_tse_probe(struct platform_device *pdev)
|
||||
priv->rxdescmem_busaddr = dma_res->start;
|
||||
|
||||
} else {
|
||||
ret = -ENODEV;
|
||||
goto err_free_netdev;
|
||||
}
|
||||
|
||||
if (!dma_set_mask(priv->device, DMA_BIT_MASK(priv->dmaops->dmamask)))
|
||||
if (!dma_set_mask(priv->device, DMA_BIT_MASK(priv->dmaops->dmamask))) {
|
||||
dma_set_coherent_mask(priv->device,
|
||||
DMA_BIT_MASK(priv->dmaops->dmamask));
|
||||
else if (!dma_set_mask(priv->device, DMA_BIT_MASK(32)))
|
||||
} else if (!dma_set_mask(priv->device, DMA_BIT_MASK(32))) {
|
||||
dma_set_coherent_mask(priv->device, DMA_BIT_MASK(32));
|
||||
else
|
||||
} else {
|
||||
ret = -EIO;
|
||||
goto err_free_netdev;
|
||||
}
|
||||
|
||||
/* MAC address space */
|
||||
ret = request_and_map(pdev, "control_port", &control_port,
|
||||
|
||||
@@ -708,7 +708,9 @@ static int bcm4908_enet_probe(struct platform_device *pdev)
|
||||
|
||||
enet->irq_tx = platform_get_irq_byname(pdev, "tx");
|
||||
|
||||
dma_set_coherent_mask(dev, DMA_BIT_MASK(32));
|
||||
err = dma_set_coherent_mask(dev, DMA_BIT_MASK(32));
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = bcm4908_enet_dma_alloc(enet);
|
||||
if (err)
|
||||
|
||||
@@ -377,6 +377,9 @@ struct bufdesc_ex {
|
||||
#define FEC_ENET_WAKEUP ((uint)0x00020000) /* Wakeup request */
|
||||
#define FEC_ENET_TXF (FEC_ENET_TXF_0 | FEC_ENET_TXF_1 | FEC_ENET_TXF_2)
|
||||
#define FEC_ENET_RXF (FEC_ENET_RXF_0 | FEC_ENET_RXF_1 | FEC_ENET_RXF_2)
|
||||
#define FEC_ENET_RXF_GET(X) (((X) == 0) ? FEC_ENET_RXF_0 : \
|
||||
(((X) == 1) ? FEC_ENET_RXF_1 : \
|
||||
FEC_ENET_RXF_2))
|
||||
#define FEC_ENET_TS_AVAIL ((uint)0x00010000)
|
||||
#define FEC_ENET_TS_TIMER ((uint)0x00008000)
|
||||
|
||||
|
||||
@@ -1480,7 +1480,7 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)
|
||||
break;
|
||||
pkt_received++;
|
||||
|
||||
writel(FEC_ENET_RXF, fep->hwp + FEC_IEVENT);
|
||||
writel(FEC_ENET_RXF_GET(queue_id), fep->hwp + FEC_IEVENT);
|
||||
|
||||
/* Check for errors. */
|
||||
status ^= BD_ENET_RX_LAST;
|
||||
|
||||
@@ -68,6 +68,9 @@ struct sk_buff *gve_rx_copy(struct net_device *dev, struct napi_struct *napi,
|
||||
set_protocol = ctx->curr_frag_cnt == ctx->expected_frag_cnt - 1;
|
||||
} else {
|
||||
skb = napi_alloc_skb(napi, len);
|
||||
|
||||
if (unlikely(!skb))
|
||||
return NULL;
|
||||
set_protocol = true;
|
||||
}
|
||||
__skb_put(skb, len);
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include "hinic_hw_dev.h"
|
||||
#include "hinic_dev.h"
|
||||
|
||||
@@ -553,6 +553,14 @@ static void i40e_dbg_dump_desc(int cnt, int vsi_seid, int ring_id, int desc_n,
|
||||
dev_info(&pf->pdev->dev, "vsi %d not found\n", vsi_seid);
|
||||
return;
|
||||
}
|
||||
if (vsi->type != I40E_VSI_MAIN &&
|
||||
vsi->type != I40E_VSI_FDIR &&
|
||||
vsi->type != I40E_VSI_VMDQ2) {
|
||||
dev_info(&pf->pdev->dev,
|
||||
"vsi %d type %d descriptor rings not available\n",
|
||||
vsi_seid, vsi->type);
|
||||
return;
|
||||
}
|
||||
if (type == RING_TYPE_XDP && !i40e_enabled_xdp_vsi(vsi)) {
|
||||
dev_info(&pf->pdev->dev, "XDP not enabled on VSI %d\n", vsi_seid);
|
||||
return;
|
||||
|
||||
@@ -1948,6 +1948,32 @@ static int i40e_vc_send_resp_to_vf(struct i40e_vf *vf,
|
||||
return i40e_vc_send_msg_to_vf(vf, opcode, retval, NULL, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_sync_vf_state
|
||||
* @vf: pointer to the VF info
|
||||
* @state: VF state
|
||||
*
|
||||
* Called from a VF message to synchronize the service with a potential
|
||||
* VF reset state
|
||||
**/
|
||||
static bool i40e_sync_vf_state(struct i40e_vf *vf, enum i40e_vf_states state)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* When handling some messages, it needs VF state to be set.
|
||||
* It is possible that this flag is cleared during VF reset,
|
||||
* so there is a need to wait until the end of the reset to
|
||||
* handle the request message correctly.
|
||||
*/
|
||||
for (i = 0; i < I40E_VF_STATE_WAIT_COUNT; i++) {
|
||||
if (test_bit(state, &vf->vf_states))
|
||||
return true;
|
||||
usleep_range(10000, 20000);
|
||||
}
|
||||
|
||||
return test_bit(state, &vf->vf_states);
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_vc_get_version_msg
|
||||
* @vf: pointer to the VF info
|
||||
@@ -2008,7 +2034,7 @@ static int i40e_vc_get_vf_resources_msg(struct i40e_vf *vf, u8 *msg)
|
||||
size_t len = 0;
|
||||
int ret;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_INIT, &vf->vf_states)) {
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_INIT)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto err;
|
||||
}
|
||||
@@ -2131,7 +2157,7 @@ static int i40e_vc_config_promiscuous_mode_msg(struct i40e_vf *vf, u8 *msg)
|
||||
bool allmulti = false;
|
||||
bool alluni = false;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto err_out;
|
||||
}
|
||||
@@ -2219,7 +2245,7 @@ static int i40e_vc_config_queues_msg(struct i40e_vf *vf, u8 *msg)
|
||||
struct i40e_vsi *vsi;
|
||||
u16 num_qps_all = 0;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto error_param;
|
||||
}
|
||||
@@ -2368,7 +2394,7 @@ static int i40e_vc_config_irq_map_msg(struct i40e_vf *vf, u8 *msg)
|
||||
i40e_status aq_ret = 0;
|
||||
int i;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto error_param;
|
||||
}
|
||||
@@ -2540,7 +2566,7 @@ static int i40e_vc_disable_queues_msg(struct i40e_vf *vf, u8 *msg)
|
||||
struct i40e_pf *pf = vf->pf;
|
||||
i40e_status aq_ret = 0;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto error_param;
|
||||
}
|
||||
@@ -2590,7 +2616,7 @@ static int i40e_vc_request_queues_msg(struct i40e_vf *vf, u8 *msg)
|
||||
u8 cur_pairs = vf->num_queue_pairs;
|
||||
struct i40e_pf *pf = vf->pf;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states))
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE))
|
||||
return -EINVAL;
|
||||
|
||||
if (req_pairs > I40E_MAX_VF_QUEUES) {
|
||||
@@ -2635,7 +2661,7 @@ static int i40e_vc_get_stats_msg(struct i40e_vf *vf, u8 *msg)
|
||||
|
||||
memset(&stats, 0, sizeof(struct i40e_eth_stats));
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto error_param;
|
||||
}
|
||||
@@ -2752,7 +2778,7 @@ static int i40e_vc_add_mac_addr_msg(struct i40e_vf *vf, u8 *msg)
|
||||
i40e_status ret = 0;
|
||||
int i;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states) ||
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE) ||
|
||||
!i40e_vc_isvalid_vsi_id(vf, al->vsi_id)) {
|
||||
ret = I40E_ERR_PARAM;
|
||||
goto error_param;
|
||||
@@ -2824,7 +2850,7 @@ static int i40e_vc_del_mac_addr_msg(struct i40e_vf *vf, u8 *msg)
|
||||
i40e_status ret = 0;
|
||||
int i;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states) ||
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE) ||
|
||||
!i40e_vc_isvalid_vsi_id(vf, al->vsi_id)) {
|
||||
ret = I40E_ERR_PARAM;
|
||||
goto error_param;
|
||||
@@ -2968,7 +2994,7 @@ static int i40e_vc_remove_vlan_msg(struct i40e_vf *vf, u8 *msg)
|
||||
i40e_status aq_ret = 0;
|
||||
int i;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states) ||
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE) ||
|
||||
!i40e_vc_isvalid_vsi_id(vf, vfl->vsi_id)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto error_param;
|
||||
@@ -3088,9 +3114,9 @@ static int i40e_vc_config_rss_key(struct i40e_vf *vf, u8 *msg)
|
||||
struct i40e_vsi *vsi = NULL;
|
||||
i40e_status aq_ret = 0;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states) ||
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE) ||
|
||||
!i40e_vc_isvalid_vsi_id(vf, vrk->vsi_id) ||
|
||||
(vrk->key_len != I40E_HKEY_ARRAY_SIZE)) {
|
||||
vrk->key_len != I40E_HKEY_ARRAY_SIZE) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto err;
|
||||
}
|
||||
@@ -3119,9 +3145,9 @@ static int i40e_vc_config_rss_lut(struct i40e_vf *vf, u8 *msg)
|
||||
i40e_status aq_ret = 0;
|
||||
u16 i;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states) ||
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE) ||
|
||||
!i40e_vc_isvalid_vsi_id(vf, vrl->vsi_id) ||
|
||||
(vrl->lut_entries != I40E_VF_HLUT_ARRAY_SIZE)) {
|
||||
vrl->lut_entries != I40E_VF_HLUT_ARRAY_SIZE) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto err;
|
||||
}
|
||||
@@ -3154,7 +3180,7 @@ static int i40e_vc_get_rss_hena(struct i40e_vf *vf, u8 *msg)
|
||||
i40e_status aq_ret = 0;
|
||||
int len = 0;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto err;
|
||||
}
|
||||
@@ -3190,7 +3216,7 @@ static int i40e_vc_set_rss_hena(struct i40e_vf *vf, u8 *msg)
|
||||
struct i40e_hw *hw = &pf->hw;
|
||||
i40e_status aq_ret = 0;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto err;
|
||||
}
|
||||
@@ -3215,7 +3241,7 @@ static int i40e_vc_enable_vlan_stripping(struct i40e_vf *vf, u8 *msg)
|
||||
i40e_status aq_ret = 0;
|
||||
struct i40e_vsi *vsi;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto err;
|
||||
}
|
||||
@@ -3241,7 +3267,7 @@ static int i40e_vc_disable_vlan_stripping(struct i40e_vf *vf, u8 *msg)
|
||||
i40e_status aq_ret = 0;
|
||||
struct i40e_vsi *vsi;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto err;
|
||||
}
|
||||
@@ -3468,7 +3494,7 @@ static int i40e_vc_del_cloud_filter(struct i40e_vf *vf, u8 *msg)
|
||||
i40e_status aq_ret = 0;
|
||||
int i, ret;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto err;
|
||||
}
|
||||
@@ -3599,7 +3625,7 @@ static int i40e_vc_add_cloud_filter(struct i40e_vf *vf, u8 *msg)
|
||||
i40e_status aq_ret = 0;
|
||||
int i, ret;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto err_out;
|
||||
}
|
||||
@@ -3708,7 +3734,7 @@ static int i40e_vc_add_qch_msg(struct i40e_vf *vf, u8 *msg)
|
||||
i40e_status aq_ret = 0;
|
||||
u64 speed = 0;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto err;
|
||||
}
|
||||
@@ -3797,11 +3823,6 @@ static int i40e_vc_add_qch_msg(struct i40e_vf *vf, u8 *msg)
|
||||
|
||||
/* set this flag only after making sure all inputs are sane */
|
||||
vf->adq_enabled = true;
|
||||
/* num_req_queues is set when user changes number of queues via ethtool
|
||||
* and this causes issue for default VSI(which depends on this variable)
|
||||
* when ADq is enabled, hence reset it.
|
||||
*/
|
||||
vf->num_req_queues = 0;
|
||||
|
||||
/* reset the VF in order to allocate resources */
|
||||
i40e_vc_reset_vf(vf, true);
|
||||
@@ -3824,7 +3845,7 @@ static int i40e_vc_del_qch_msg(struct i40e_vf *vf, u8 *msg)
|
||||
struct i40e_pf *pf = vf->pf;
|
||||
i40e_status aq_ret = 0;
|
||||
|
||||
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
|
||||
if (!i40e_sync_vf_state(vf, I40E_VF_STATE_ACTIVE)) {
|
||||
aq_ret = I40E_ERR_PARAM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
|
||||
#define I40E_MAX_VF_PROMISC_FLAGS 3
|
||||
|
||||
#define I40E_VF_STATE_WAIT_COUNT 20
|
||||
|
||||
/* Various queue ctrls */
|
||||
enum i40e_queue_ctrl {
|
||||
I40E_QUEUE_CTRL_UNKNOWN = 0,
|
||||
|
||||
@@ -615,23 +615,44 @@ static int iavf_set_ringparam(struct net_device *netdev,
|
||||
if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
|
||||
return -EINVAL;
|
||||
|
||||
new_tx_count = clamp_t(u32, ring->tx_pending,
|
||||
IAVF_MIN_TXD,
|
||||
IAVF_MAX_TXD);
|
||||
new_tx_count = ALIGN(new_tx_count, IAVF_REQ_DESCRIPTOR_MULTIPLE);
|
||||
if (ring->tx_pending > IAVF_MAX_TXD ||
|
||||
ring->tx_pending < IAVF_MIN_TXD ||
|
||||
ring->rx_pending > IAVF_MAX_RXD ||
|
||||
ring->rx_pending < IAVF_MIN_RXD) {
|
||||
netdev_err(netdev, "Descriptors requested (Tx: %d / Rx: %d) out of range [%d-%d] (increment %d)\n",
|
||||
ring->tx_pending, ring->rx_pending, IAVF_MIN_TXD,
|
||||
IAVF_MAX_RXD, IAVF_REQ_DESCRIPTOR_MULTIPLE);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
new_rx_count = clamp_t(u32, ring->rx_pending,
|
||||
IAVF_MIN_RXD,
|
||||
IAVF_MAX_RXD);
|
||||
new_rx_count = ALIGN(new_rx_count, IAVF_REQ_DESCRIPTOR_MULTIPLE);
|
||||
new_tx_count = ALIGN(ring->tx_pending, IAVF_REQ_DESCRIPTOR_MULTIPLE);
|
||||
if (new_tx_count != ring->tx_pending)
|
||||
netdev_info(netdev, "Requested Tx descriptor count rounded up to %d\n",
|
||||
new_tx_count);
|
||||
|
||||
new_rx_count = ALIGN(ring->rx_pending, IAVF_REQ_DESCRIPTOR_MULTIPLE);
|
||||
if (new_rx_count != ring->rx_pending)
|
||||
netdev_info(netdev, "Requested Rx descriptor count rounded up to %d\n",
|
||||
new_rx_count);
|
||||
|
||||
/* if nothing to do return success */
|
||||
if ((new_tx_count == adapter->tx_desc_count) &&
|
||||
(new_rx_count == adapter->rx_desc_count))
|
||||
(new_rx_count == adapter->rx_desc_count)) {
|
||||
netdev_dbg(netdev, "Nothing to change, descriptor count is same as requested\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
adapter->tx_desc_count = new_tx_count;
|
||||
adapter->rx_desc_count = new_rx_count;
|
||||
if (new_tx_count != adapter->tx_desc_count) {
|
||||
netdev_dbg(netdev, "Changing Tx descriptor count from %d to %d\n",
|
||||
adapter->tx_desc_count, new_tx_count);
|
||||
adapter->tx_desc_count = new_tx_count;
|
||||
}
|
||||
|
||||
if (new_rx_count != adapter->rx_desc_count) {
|
||||
netdev_dbg(netdev, "Changing Rx descriptor count from %d to %d\n",
|
||||
adapter->rx_desc_count, new_rx_count);
|
||||
adapter->rx_desc_count = new_rx_count;
|
||||
}
|
||||
|
||||
if (netif_running(netdev)) {
|
||||
adapter->flags |= IAVF_FLAG_RESET_NEEDED;
|
||||
|
||||
@@ -2248,6 +2248,7 @@ static void iavf_reset_task(struct work_struct *work)
|
||||
}
|
||||
|
||||
pci_set_master(adapter->pdev);
|
||||
pci_restore_msi_state(adapter->pdev);
|
||||
|
||||
if (i == IAVF_RESET_WAIT_COMPLETE_COUNT) {
|
||||
dev_err(&adapter->pdev->dev, "Reset never finished (%x)\n",
|
||||
|
||||
@@ -97,6 +97,9 @@ static int ice_dcbnl_setets(struct net_device *netdev, struct ieee_ets *ets)
|
||||
|
||||
new_cfg->etscfg.maxtcs = pf->hw.func_caps.common_cap.maxtc;
|
||||
|
||||
if (!bwcfg)
|
||||
new_cfg->etscfg.tcbwtable[0] = 100;
|
||||
|
||||
if (!bwrec)
|
||||
new_cfg->etsrec.tcbwtable[0] = 100;
|
||||
|
||||
@@ -167,15 +170,18 @@ static u8 ice_dcbnl_setdcbx(struct net_device *netdev, u8 mode)
|
||||
if (mode == pf->dcbx_cap)
|
||||
return ICE_DCB_NO_HW_CHG;
|
||||
|
||||
pf->dcbx_cap = mode;
|
||||
qos_cfg = &pf->hw.port_info->qos_cfg;
|
||||
if (mode & DCB_CAP_DCBX_VER_CEE) {
|
||||
if (qos_cfg->local_dcbx_cfg.pfc_mode == ICE_QOS_MODE_DSCP)
|
||||
return ICE_DCB_NO_HW_CHG;
|
||||
|
||||
/* DSCP configuration is not DCBx negotiated */
|
||||
if (qos_cfg->local_dcbx_cfg.pfc_mode == ICE_QOS_MODE_DSCP)
|
||||
return ICE_DCB_NO_HW_CHG;
|
||||
|
||||
pf->dcbx_cap = mode;
|
||||
|
||||
if (mode & DCB_CAP_DCBX_VER_CEE)
|
||||
qos_cfg->local_dcbx_cfg.dcbx_mode = ICE_DCBX_MODE_CEE;
|
||||
} else {
|
||||
else
|
||||
qos_cfg->local_dcbx_cfg.dcbx_mode = ICE_DCBX_MODE_IEEE;
|
||||
}
|
||||
|
||||
dev_info(ice_pf_to_dev(pf), "DCBx mode = 0x%x\n", mode);
|
||||
return ICE_DCB_HW_CHG_RST;
|
||||
|
||||
@@ -1268,7 +1268,7 @@ ice_fdir_write_all_fltr(struct ice_pf *pf, struct ice_fdir_fltr *input,
|
||||
bool is_tun = tun == ICE_FD_HW_SEG_TUN;
|
||||
int err;
|
||||
|
||||
if (is_tun && !ice_get_open_tunnel_port(&pf->hw, &port_num))
|
||||
if (is_tun && !ice_get_open_tunnel_port(&pf->hw, &port_num, TNL_ALL))
|
||||
continue;
|
||||
err = ice_fdir_write_fltr(pf, input, add, is_tun);
|
||||
if (err)
|
||||
@@ -1652,7 +1652,7 @@ int ice_add_fdir_ethtool(struct ice_vsi *vsi, struct ethtool_rxnfc *cmd)
|
||||
}
|
||||
|
||||
/* return error if not an update and no available filters */
|
||||
fltrs_needed = ice_get_open_tunnel_port(hw, &tunnel_port) ? 2 : 1;
|
||||
fltrs_needed = ice_get_open_tunnel_port(hw, &tunnel_port, TNL_ALL) ? 2 : 1;
|
||||
if (!ice_fdir_find_fltr_by_idx(hw, fsp->location) &&
|
||||
ice_fdir_num_avail_fltr(hw, pf->vsi[vsi->idx]) < fltrs_needed) {
|
||||
dev_err(dev, "Failed to add filter. The maximum number of flow director filters has been reached.\n");
|
||||
|
||||
@@ -924,7 +924,7 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
|
||||
memcpy(pkt, ice_fdir_pkt[idx].pkt, ice_fdir_pkt[idx].pkt_len);
|
||||
loc = pkt;
|
||||
} else {
|
||||
if (!ice_get_open_tunnel_port(hw, &tnl_port))
|
||||
if (!ice_get_open_tunnel_port(hw, &tnl_port, TNL_ALL))
|
||||
return ICE_ERR_DOES_NOT_EXIST;
|
||||
if (!ice_fdir_pkt[idx].tun_pkt)
|
||||
return ICE_ERR_PARAM;
|
||||
|
||||
@@ -1899,9 +1899,11 @@ static struct ice_buf *ice_pkg_buf(struct ice_buf_build *bld)
|
||||
* ice_get_open_tunnel_port - retrieve an open tunnel port
|
||||
* @hw: pointer to the HW structure
|
||||
* @port: returns open port
|
||||
* @type: type of tunnel, can be TNL_LAST if it doesn't matter
|
||||
*/
|
||||
bool
|
||||
ice_get_open_tunnel_port(struct ice_hw *hw, u16 *port)
|
||||
ice_get_open_tunnel_port(struct ice_hw *hw, u16 *port,
|
||||
enum ice_tunnel_type type)
|
||||
{
|
||||
bool res = false;
|
||||
u16 i;
|
||||
@@ -1909,7 +1911,8 @@ ice_get_open_tunnel_port(struct ice_hw *hw, u16 *port)
|
||||
mutex_lock(&hw->tnl_lock);
|
||||
|
||||
for (i = 0; i < hw->tnl.count && i < ICE_TUNNEL_MAX_ENTRIES; i++)
|
||||
if (hw->tnl.tbl[i].valid && hw->tnl.tbl[i].port) {
|
||||
if (hw->tnl.tbl[i].valid && hw->tnl.tbl[i].port &&
|
||||
(type == TNL_LAST || type == hw->tnl.tbl[i].type)) {
|
||||
*port = hw->tnl.tbl[i].port;
|
||||
res = true;
|
||||
break;
|
||||
|
||||
@@ -33,7 +33,8 @@ enum ice_status
|
||||
ice_get_sw_fv_list(struct ice_hw *hw, u8 *prot_ids, u16 ids_cnt,
|
||||
unsigned long *bm, struct list_head *fv_list);
|
||||
bool
|
||||
ice_get_open_tunnel_port(struct ice_hw *hw, u16 *port);
|
||||
ice_get_open_tunnel_port(struct ice_hw *hw, u16 *port,
|
||||
enum ice_tunnel_type type);
|
||||
int ice_udp_tunnel_set_port(struct net_device *netdev, unsigned int table,
|
||||
unsigned int idx, struct udp_tunnel_info *ti);
|
||||
int ice_udp_tunnel_unset_port(struct net_device *netdev, unsigned int table,
|
||||
|
||||
@@ -5881,6 +5881,9 @@ static int ice_up_complete(struct ice_vsi *vsi)
|
||||
netif_carrier_on(vsi->netdev);
|
||||
}
|
||||
|
||||
/* clear this now, and the first stats read will be used as baseline */
|
||||
vsi->stat_offsets_loaded = false;
|
||||
|
||||
ice_service_task_schedule(pf);
|
||||
|
||||
return 0;
|
||||
@@ -5927,14 +5930,15 @@ ice_fetch_u64_stats_per_ring(struct u64_stats_sync *syncp, struct ice_q_stats st
|
||||
/**
|
||||
* ice_update_vsi_tx_ring_stats - Update VSI Tx ring stats counters
|
||||
* @vsi: the VSI to be updated
|
||||
* @vsi_stats: the stats struct to be updated
|
||||
* @rings: rings to work on
|
||||
* @count: number of rings
|
||||
*/
|
||||
static void
|
||||
ice_update_vsi_tx_ring_stats(struct ice_vsi *vsi, struct ice_tx_ring **rings,
|
||||
u16 count)
|
||||
ice_update_vsi_tx_ring_stats(struct ice_vsi *vsi,
|
||||
struct rtnl_link_stats64 *vsi_stats,
|
||||
struct ice_tx_ring **rings, u16 count)
|
||||
{
|
||||
struct rtnl_link_stats64 *vsi_stats = &vsi->net_stats;
|
||||
u16 i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
@@ -5958,15 +5962,13 @@ ice_update_vsi_tx_ring_stats(struct ice_vsi *vsi, struct ice_tx_ring **rings,
|
||||
*/
|
||||
static void ice_update_vsi_ring_stats(struct ice_vsi *vsi)
|
||||
{
|
||||
struct rtnl_link_stats64 *vsi_stats = &vsi->net_stats;
|
||||
struct rtnl_link_stats64 *vsi_stats;
|
||||
u64 pkts, bytes;
|
||||
int i;
|
||||
|
||||
/* reset netdev stats */
|
||||
vsi_stats->tx_packets = 0;
|
||||
vsi_stats->tx_bytes = 0;
|
||||
vsi_stats->rx_packets = 0;
|
||||
vsi_stats->rx_bytes = 0;
|
||||
vsi_stats = kzalloc(sizeof(*vsi_stats), GFP_ATOMIC);
|
||||
if (!vsi_stats)
|
||||
return;
|
||||
|
||||
/* reset non-netdev (extended) stats */
|
||||
vsi->tx_restart = 0;
|
||||
@@ -5978,7 +5980,8 @@ static void ice_update_vsi_ring_stats(struct ice_vsi *vsi)
|
||||
rcu_read_lock();
|
||||
|
||||
/* update Tx rings counters */
|
||||
ice_update_vsi_tx_ring_stats(vsi, vsi->tx_rings, vsi->num_txq);
|
||||
ice_update_vsi_tx_ring_stats(vsi, vsi_stats, vsi->tx_rings,
|
||||
vsi->num_txq);
|
||||
|
||||
/* update Rx rings counters */
|
||||
ice_for_each_rxq(vsi, i) {
|
||||
@@ -5993,10 +5996,17 @@ static void ice_update_vsi_ring_stats(struct ice_vsi *vsi)
|
||||
|
||||
/* update XDP Tx rings counters */
|
||||
if (ice_is_xdp_ena_vsi(vsi))
|
||||
ice_update_vsi_tx_ring_stats(vsi, vsi->xdp_rings,
|
||||
ice_update_vsi_tx_ring_stats(vsi, vsi_stats, vsi->xdp_rings,
|
||||
vsi->num_xdp_txq);
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
vsi->net_stats.tx_packets = vsi_stats->tx_packets;
|
||||
vsi->net_stats.tx_bytes = vsi_stats->tx_bytes;
|
||||
vsi->net_stats.rx_packets = vsi_stats->rx_packets;
|
||||
vsi->net_stats.rx_bytes = vsi_stats->rx_bytes;
|
||||
|
||||
kfree(vsi_stats);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -3796,10 +3796,13 @@ static struct ice_protocol_entry ice_prot_id_tbl[ICE_PROTOCOL_LAST] = {
|
||||
* ice_find_recp - find a recipe
|
||||
* @hw: pointer to the hardware structure
|
||||
* @lkup_exts: extension sequence to match
|
||||
* @tun_type: type of recipe tunnel
|
||||
*
|
||||
* Returns index of matching recipe, or ICE_MAX_NUM_RECIPES if not found.
|
||||
*/
|
||||
static u16 ice_find_recp(struct ice_hw *hw, struct ice_prot_lkup_ext *lkup_exts)
|
||||
static u16
|
||||
ice_find_recp(struct ice_hw *hw, struct ice_prot_lkup_ext *lkup_exts,
|
||||
enum ice_sw_tunnel_type tun_type)
|
||||
{
|
||||
bool refresh_required = true;
|
||||
struct ice_sw_recipe *recp;
|
||||
@@ -3860,8 +3863,9 @@ static u16 ice_find_recp(struct ice_hw *hw, struct ice_prot_lkup_ext *lkup_exts)
|
||||
}
|
||||
/* If for "i"th recipe the found was never set to false
|
||||
* then it means we found our match
|
||||
* Also tun type of recipe needs to be checked
|
||||
*/
|
||||
if (found)
|
||||
if (found && recp[i].tun_type == tun_type)
|
||||
return i; /* Return the recipe ID */
|
||||
}
|
||||
}
|
||||
@@ -4651,11 +4655,12 @@ ice_add_adv_recipe(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
|
||||
}
|
||||
|
||||
/* Look for a recipe which matches our requested fv / mask list */
|
||||
*rid = ice_find_recp(hw, lkup_exts);
|
||||
*rid = ice_find_recp(hw, lkup_exts, rinfo->tun_type);
|
||||
if (*rid < ICE_MAX_NUM_RECIPES)
|
||||
/* Success if found a recipe that match the existing criteria */
|
||||
goto err_unroll;
|
||||
|
||||
rm->tun_type = rinfo->tun_type;
|
||||
/* Recipe we need does not exist, add a recipe */
|
||||
status = ice_add_sw_recipe(hw, rm, profiles);
|
||||
if (status)
|
||||
@@ -4958,11 +4963,13 @@ ice_fill_adv_packet_tun(struct ice_hw *hw, enum ice_sw_tunnel_type tun_type,
|
||||
|
||||
switch (tun_type) {
|
||||
case ICE_SW_TUN_VXLAN:
|
||||
case ICE_SW_TUN_GENEVE:
|
||||
if (!ice_get_open_tunnel_port(hw, &open_port))
|
||||
if (!ice_get_open_tunnel_port(hw, &open_port, TNL_VXLAN))
|
||||
return ICE_ERR_CFG;
|
||||
break;
|
||||
case ICE_SW_TUN_GENEVE:
|
||||
if (!ice_get_open_tunnel_port(hw, &open_port, TNL_GENEVE))
|
||||
return ICE_ERR_CFG;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Nothing needs to be done for this tunnel type */
|
||||
return 0;
|
||||
@@ -5555,7 +5562,7 @@ ice_rem_adv_rule(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
rid = ice_find_recp(hw, &lkup_exts);
|
||||
rid = ice_find_recp(hw, &lkup_exts, rinfo->tun_type);
|
||||
/* If did not find a recipe that match the existing criteria */
|
||||
if (rid == ICE_MAX_NUM_RECIPES)
|
||||
return ICE_ERR_PARAM;
|
||||
|
||||
@@ -74,21 +74,13 @@ static enum ice_protocol_type ice_proto_type_from_ipv6(bool inner)
|
||||
return inner ? ICE_IPV6_IL : ICE_IPV6_OFOS;
|
||||
}
|
||||
|
||||
static enum ice_protocol_type
|
||||
ice_proto_type_from_l4_port(bool inner, u16 ip_proto)
|
||||
static enum ice_protocol_type ice_proto_type_from_l4_port(u16 ip_proto)
|
||||
{
|
||||
if (inner) {
|
||||
switch (ip_proto) {
|
||||
case IPPROTO_UDP:
|
||||
return ICE_UDP_ILOS;
|
||||
}
|
||||
} else {
|
||||
switch (ip_proto) {
|
||||
case IPPROTO_TCP:
|
||||
return ICE_TCP_IL;
|
||||
case IPPROTO_UDP:
|
||||
return ICE_UDP_OF;
|
||||
}
|
||||
switch (ip_proto) {
|
||||
case IPPROTO_TCP:
|
||||
return ICE_TCP_IL;
|
||||
case IPPROTO_UDP:
|
||||
return ICE_UDP_ILOS;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -191,8 +183,9 @@ ice_tc_fill_tunnel_outer(u32 flags, struct ice_tc_flower_fltr *fltr,
|
||||
i++;
|
||||
}
|
||||
|
||||
if (flags & ICE_TC_FLWR_FIELD_ENC_DEST_L4_PORT) {
|
||||
list[i].type = ice_proto_type_from_l4_port(false, hdr->l3_key.ip_proto);
|
||||
if ((flags & ICE_TC_FLWR_FIELD_ENC_DEST_L4_PORT) &&
|
||||
hdr->l3_key.ip_proto == IPPROTO_UDP) {
|
||||
list[i].type = ICE_UDP_OF;
|
||||
list[i].h_u.l4_hdr.dst_port = hdr->l4_key.dst_port;
|
||||
list[i].m_u.l4_hdr.dst_port = hdr->l4_mask.dst_port;
|
||||
i++;
|
||||
@@ -317,7 +310,7 @@ ice_tc_fill_rules(struct ice_hw *hw, u32 flags,
|
||||
ICE_TC_FLWR_FIELD_SRC_L4_PORT)) {
|
||||
struct ice_tc_l4_hdr *l4_key, *l4_mask;
|
||||
|
||||
list[i].type = ice_proto_type_from_l4_port(inner, headers->l3_key.ip_proto);
|
||||
list[i].type = ice_proto_type_from_l4_port(headers->l3_key.ip_proto);
|
||||
l4_key = &headers->l4_key;
|
||||
l4_mask = &headers->l4_mask;
|
||||
|
||||
@@ -802,7 +795,8 @@ ice_parse_tunnel_attr(struct net_device *dev, struct flow_rule *rule,
|
||||
headers->l3_mask.ttl = match.mask->ttl;
|
||||
}
|
||||
|
||||
if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_PORTS)) {
|
||||
if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_ENC_PORTS) &&
|
||||
fltr->tunnel_type != TNL_VXLAN && fltr->tunnel_type != TNL_GENEVE) {
|
||||
struct flow_match_ports match;
|
||||
|
||||
flow_rule_match_enc_ports(rule, &match);
|
||||
|
||||
@@ -1617,6 +1617,7 @@ bool ice_reset_all_vfs(struct ice_pf *pf, bool is_vflr)
|
||||
ice_vc_set_default_allowlist(vf);
|
||||
|
||||
ice_vf_fdir_exit(vf);
|
||||
ice_vf_fdir_init(vf);
|
||||
/* clean VF control VSI when resetting VFs since it should be
|
||||
* setup only when VF creates its first FDIR rule.
|
||||
*/
|
||||
@@ -1747,6 +1748,7 @@ bool ice_reset_vf(struct ice_vf *vf, bool is_vflr)
|
||||
}
|
||||
|
||||
ice_vf_fdir_exit(vf);
|
||||
ice_vf_fdir_init(vf);
|
||||
/* clean VF control VSI when resetting VF since it should be setup
|
||||
* only when VF creates its first FDIR rule.
|
||||
*/
|
||||
@@ -2021,6 +2023,10 @@ static int ice_ena_vfs(struct ice_pf *pf, u16 num_vfs)
|
||||
if (ret)
|
||||
goto err_unroll_sriov;
|
||||
|
||||
/* rearm global interrupts */
|
||||
if (test_and_clear_bit(ICE_OICR_INTR_DIS, pf->state))
|
||||
ice_irq_dynamic_ena(hw, NULL, NULL);
|
||||
|
||||
return 0;
|
||||
|
||||
err_unroll_sriov:
|
||||
|
||||
@@ -2960,11 +2960,11 @@ static int mvpp2_rxq_init(struct mvpp2_port *port,
|
||||
mvpp2_rxq_status_update(port, rxq->id, 0, rxq->size);
|
||||
|
||||
if (priv->percpu_pools) {
|
||||
err = xdp_rxq_info_reg(&rxq->xdp_rxq_short, port->dev, rxq->id, 0);
|
||||
err = xdp_rxq_info_reg(&rxq->xdp_rxq_short, port->dev, rxq->logic_rxq, 0);
|
||||
if (err < 0)
|
||||
goto err_free_dma;
|
||||
|
||||
err = xdp_rxq_info_reg(&rxq->xdp_rxq_long, port->dev, rxq->id, 0);
|
||||
err = xdp_rxq_info_reg(&rxq->xdp_rxq_long, port->dev, rxq->logic_rxq, 0);
|
||||
if (err < 0)
|
||||
goto err_unregister_rxq_short;
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
|
||||
#include "otx2_common.h"
|
||||
#include "otx2_ptp.h"
|
||||
|
||||
|
||||
@@ -480,16 +480,16 @@ static int mana_hwc_create_wq(struct hw_channel_context *hwc,
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = mana_hwc_alloc_dma_buf(hwc, q_depth, max_msg_size,
|
||||
&hwc_wq->msg_buf);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
hwc_wq->hwc = hwc;
|
||||
hwc_wq->gdma_wq = queue;
|
||||
hwc_wq->queue_depth = q_depth;
|
||||
hwc_wq->hwc_cq = hwc_cq;
|
||||
|
||||
err = mana_hwc_alloc_dma_buf(hwc, q_depth, max_msg_size,
|
||||
&hwc_wq->msg_buf);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
*hwc_wq_ptr = hwc_wq;
|
||||
return 0;
|
||||
out:
|
||||
|
||||
@@ -803,8 +803,10 @@ int nfp_cpp_area_cache_add(struct nfp_cpp *cpp, size_t size)
|
||||
return -ENOMEM;
|
||||
|
||||
cache = kzalloc(sizeof(*cache), GFP_KERNEL);
|
||||
if (!cache)
|
||||
if (!cache) {
|
||||
nfp_cpp_area_free(area);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
cache->id = 0;
|
||||
cache->addr = 0;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user