Merge branch 'pci/switchtec'
- Support all 255 PFF ports in switchtec driver (Wesley Sheng) - Fix unintentional switchtec MRPC event masking that degraded firmware update speed (Wesley Sheng) * pci/switchtec: switchtec: Fix unintended mask of MRPC event switchtec: Increase PFF limit from 48 to 255
This commit is contained in:
Коммит
da33ae0129
|
@ -658,19 +658,25 @@ static int ioctl_flash_part_info(struct switchtec_dev *stdev,
|
|||
|
||||
static int ioctl_event_summary(struct switchtec_dev *stdev,
|
||||
struct switchtec_user *stuser,
|
||||
struct switchtec_ioctl_event_summary __user *usum)
|
||||
struct switchtec_ioctl_event_summary __user *usum,
|
||||
size_t size)
|
||||
{
|
||||
struct switchtec_ioctl_event_summary s = {0};
|
||||
struct switchtec_ioctl_event_summary *s;
|
||||
int i;
|
||||
u32 reg;
|
||||
int ret = 0;
|
||||
|
||||
s.global = ioread32(&stdev->mmio_sw_event->global_summary);
|
||||
s.part_bitmap = ioread32(&stdev->mmio_sw_event->part_event_bitmap);
|
||||
s.local_part = ioread32(&stdev->mmio_part_cfg->part_event_summary);
|
||||
s = kzalloc(sizeof(*s), GFP_KERNEL);
|
||||
if (!s)
|
||||
return -ENOMEM;
|
||||
|
||||
s->global = ioread32(&stdev->mmio_sw_event->global_summary);
|
||||
s->part_bitmap = ioread32(&stdev->mmio_sw_event->part_event_bitmap);
|
||||
s->local_part = ioread32(&stdev->mmio_part_cfg->part_event_summary);
|
||||
|
||||
for (i = 0; i < stdev->partition_count; i++) {
|
||||
reg = ioread32(&stdev->mmio_part_cfg_all[i].part_event_summary);
|
||||
s.part[i] = reg;
|
||||
s->part[i] = reg;
|
||||
}
|
||||
|
||||
for (i = 0; i < SWITCHTEC_MAX_PFF_CSR; i++) {
|
||||
|
@ -679,15 +685,19 @@ static int ioctl_event_summary(struct switchtec_dev *stdev,
|
|||
break;
|
||||
|
||||
reg = ioread32(&stdev->mmio_pff_csr[i].pff_event_summary);
|
||||
s.pff[i] = reg;
|
||||
s->pff[i] = reg;
|
||||
}
|
||||
|
||||
if (copy_to_user(usum, &s, sizeof(s)))
|
||||
return -EFAULT;
|
||||
if (copy_to_user(usum, s, size)) {
|
||||
ret = -EFAULT;
|
||||
goto error_case;
|
||||
}
|
||||
|
||||
stuser->event_cnt = atomic_read(&stdev->event_cnt);
|
||||
|
||||
return 0;
|
||||
error_case:
|
||||
kfree(s);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u32 __iomem *global_ev_reg(struct switchtec_dev *stdev,
|
||||
|
@ -977,8 +987,9 @@ static long switchtec_dev_ioctl(struct file *filp, unsigned int cmd,
|
|||
case SWITCHTEC_IOCTL_FLASH_PART_INFO:
|
||||
rc = ioctl_flash_part_info(stdev, argp);
|
||||
break;
|
||||
case SWITCHTEC_IOCTL_EVENT_SUMMARY:
|
||||
rc = ioctl_event_summary(stdev, stuser, argp);
|
||||
case SWITCHTEC_IOCTL_EVENT_SUMMARY_LEGACY:
|
||||
rc = ioctl_event_summary(stdev, stuser, argp,
|
||||
sizeof(struct switchtec_ioctl_event_summary_legacy));
|
||||
break;
|
||||
case SWITCHTEC_IOCTL_EVENT_CTL:
|
||||
rc = ioctl_event_ctl(stdev, argp);
|
||||
|
@ -989,6 +1000,10 @@ static long switchtec_dev_ioctl(struct file *filp, unsigned int cmd,
|
|||
case SWITCHTEC_IOCTL_PORT_TO_PFF:
|
||||
rc = ioctl_port_to_pff(stdev, argp);
|
||||
break;
|
||||
case SWITCHTEC_IOCTL_EVENT_SUMMARY:
|
||||
rc = ioctl_event_summary(stdev, stuser, argp,
|
||||
sizeof(struct switchtec_ioctl_event_summary));
|
||||
break;
|
||||
default:
|
||||
rc = -ENOTTY;
|
||||
break;
|
||||
|
@ -1162,7 +1177,8 @@ static int mask_event(struct switchtec_dev *stdev, int eid, int idx)
|
|||
if (!(hdr & SWITCHTEC_EVENT_OCCURRED && hdr & SWITCHTEC_EVENT_EN_IRQ))
|
||||
return 0;
|
||||
|
||||
if (eid == SWITCHTEC_IOCTL_EVENT_LINK_STATE)
|
||||
if (eid == SWITCHTEC_IOCTL_EVENT_LINK_STATE ||
|
||||
eid == SWITCHTEC_IOCTL_EVENT_MRPC_COMP)
|
||||
return 0;
|
||||
|
||||
dev_dbg(&stdev->dev, "%s: %d %d %x\n", __func__, eid, idx, hdr);
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#include <linux/cdev.h>
|
||||
|
||||
#define SWITCHTEC_MRPC_PAYLOAD_SIZE 1024
|
||||
#define SWITCHTEC_MAX_PFF_CSR 48
|
||||
#define SWITCHTEC_MAX_PFF_CSR 255
|
||||
|
||||
#define SWITCHTEC_EVENT_OCCURRED BIT(0)
|
||||
#define SWITCHTEC_EVENT_CLEAR BIT(0)
|
||||
|
|
|
@ -50,7 +50,7 @@ struct switchtec_ioctl_flash_part_info {
|
|||
__u32 active;
|
||||
};
|
||||
|
||||
struct switchtec_ioctl_event_summary {
|
||||
struct switchtec_ioctl_event_summary_legacy {
|
||||
__u64 global;
|
||||
__u64 part_bitmap;
|
||||
__u32 local_part;
|
||||
|
@ -59,6 +59,15 @@ struct switchtec_ioctl_event_summary {
|
|||
__u32 pff[48];
|
||||
};
|
||||
|
||||
struct switchtec_ioctl_event_summary {
|
||||
__u64 global;
|
||||
__u64 part_bitmap;
|
||||
__u32 local_part;
|
||||
__u32 padding;
|
||||
__u32 part[48];
|
||||
__u32 pff[255];
|
||||
};
|
||||
|
||||
#define SWITCHTEC_IOCTL_EVENT_STACK_ERROR 0
|
||||
#define SWITCHTEC_IOCTL_EVENT_PPU_ERROR 1
|
||||
#define SWITCHTEC_IOCTL_EVENT_ISP_ERROR 2
|
||||
|
@ -127,6 +136,8 @@ struct switchtec_ioctl_pff_port {
|
|||
_IOWR('W', 0x41, struct switchtec_ioctl_flash_part_info)
|
||||
#define SWITCHTEC_IOCTL_EVENT_SUMMARY \
|
||||
_IOR('W', 0x42, struct switchtec_ioctl_event_summary)
|
||||
#define SWITCHTEC_IOCTL_EVENT_SUMMARY_LEGACY \
|
||||
_IOR('W', 0x42, struct switchtec_ioctl_event_summary_legacy)
|
||||
#define SWITCHTEC_IOCTL_EVENT_CTL \
|
||||
_IOWR('W', 0x43, struct switchtec_ioctl_event_ctl)
|
||||
#define SWITCHTEC_IOCTL_PFF_TO_PORT \
|
||||
|
|
Загрузка…
Ссылка в новой задаче