diff --git a/[refs] b/[refs] index 57918ce9555b..c66b014bbea0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e67306a38063d75f61d405527ff8bf1c8e92eb84 +refs/heads/master: fd1b6c4a693c9cac59375ffb36ffe5d7c079037c diff --git a/trunk/MAINTAINERS b/trunk/MAINTAINERS index df90fb5c0860..187282da9213 100644 --- a/trunk/MAINTAINERS +++ b/trunk/MAINTAINERS @@ -3425,9 +3425,10 @@ S: Maintained F: drivers/net/ipg.* IPATH DRIVER -M: Mike Marciniszyn +M: Ralph Campbell L: linux-rdma@vger.kernel.org -S: Maintained +T: git git://git.qlogic.com/ipath-linux-2.6 +S: Supported F: drivers/infiniband/hw/ipath/ IPMI SUBSYSTEM @@ -5151,12 +5152,6 @@ M: Robert Jarzmik L: rtc-linux@googlegroups.com S: Maintained -QIB DRIVER -M: Mike Marciniszyn -L: linux-rdma@vger.kernel.org -S: Supported -F: drivers/infiniband/hw/qib/ - QLOGIC QLA1280 SCSI DRIVER M: Michael Reed L: linux-scsi@vger.kernel.org diff --git a/trunk/drivers/infiniband/hw/qib/qib.h b/trunk/drivers/infiniband/hw/qib/qib.h index c9624ea87209..769a1d9da4b7 100644 --- a/trunk/drivers/infiniband/hw/qib/qib.h +++ b/trunk/drivers/infiniband/hw/qib/qib.h @@ -1012,8 +1012,6 @@ struct qib_devdata { u8 psxmitwait_supported; /* cycle length of PS* counters in HW (in picoseconds) */ u16 psxmitwait_check_rate; - /* high volume overflow errors defered to tasklet */ - struct tasklet_struct error_tasklet; }; /* hol_state values */ @@ -1435,7 +1433,6 @@ extern struct mutex qib_mutex; struct qib_hwerror_msgs { u64 mask; const char *msg; - size_t sz; }; #define QLOGIC_IB_HWE_MSG(a, b) { .mask = a, .msg = b } diff --git a/trunk/drivers/infiniband/hw/qib/qib_file_ops.c b/trunk/drivers/infiniband/hw/qib/qib_file_ops.c index 26253039d2c7..406fca50d036 100644 --- a/trunk/drivers/infiniband/hw/qib/qib_file_ops.c +++ b/trunk/drivers/infiniband/hw/qib/qib_file_ops.c @@ -1527,7 +1527,6 @@ static int qib_assign_ctxt(struct file *fp, const struct qib_user_info *uinfo) struct qib_filedata *fd = fp->private_data; const struct qib_ctxtdata *rcd = fd->rcd; const struct qib_devdata *dd = rcd->dd; - unsigned int weight; if (dd->flags & QIB_HAS_SEND_DMA) { fd->pq = qib_user_sdma_queue_create(&dd->pcidev->dev, @@ -1546,8 +1545,8 @@ static int qib_assign_ctxt(struct file *fp, const struct qib_user_info *uinfo) * it just means that sooner or later we don't recommend * a cpu, and let the scheduler do it's best. */ - weight = cpumask_weight(tsk_cpus_allowed(current)); - if (!ret && weight >= qib_cpulist_count) { + if (!ret && cpus_weight(current->cpus_allowed) >= + qib_cpulist_count) { int cpu; cpu = find_first_zero_bit(qib_cpulist, qib_cpulist_count); @@ -1555,13 +1554,13 @@ static int qib_assign_ctxt(struct file *fp, const struct qib_user_info *uinfo) __set_bit(cpu, qib_cpulist); fd->rec_cpu_num = cpu; } - } else if (weight == 1 && - test_bit(cpumask_first(tsk_cpus_allowed(current)), + } else if (cpus_weight(current->cpus_allowed) == 1 && + test_bit(first_cpu(current->cpus_allowed), qib_cpulist)) qib_devinfo(dd->pcidev, "%s PID %u affinity " "set to cpu %d; already allocated\n", current->comm, current->pid, - cpumask_first(tsk_cpus_allowed(current))); + first_cpu(current->cpus_allowed)); } mutex_unlock(&qib_mutex); @@ -1905,9 +1904,8 @@ int qib_set_uevent_bits(struct qib_pportdata *ppd, const int evtbit) struct qib_ctxtdata *rcd; unsigned ctxt; int ret = 0; - unsigned long flags; - spin_lock_irqsave(&ppd->dd->uctxt_lock, flags); + spin_lock(&ppd->dd->uctxt_lock); for (ctxt = ppd->dd->first_user_ctxt; ctxt < ppd->dd->cfgctxts; ctxt++) { rcd = ppd->dd->rcd[ctxt]; @@ -1926,7 +1924,7 @@ int qib_set_uevent_bits(struct qib_pportdata *ppd, const int evtbit) ret = 1; break; } - spin_unlock_irqrestore(&ppd->dd->uctxt_lock, flags); + spin_unlock(&ppd->dd->uctxt_lock); return ret; } diff --git a/trunk/drivers/infiniband/hw/qib/qib_iba7220.c b/trunk/drivers/infiniband/hw/qib/qib_iba7220.c index e1f947446c2a..c765a2eb04cf 100644 --- a/trunk/drivers/infiniband/hw/qib/qib_iba7220.c +++ b/trunk/drivers/infiniband/hw/qib/qib_iba7220.c @@ -2434,7 +2434,6 @@ static int qib_7220_set_ib_cfg(struct qib_pportdata *ppd, int which, u32 val) int lsb, ret = 0, setforce = 0; u16 lcmd, licmd; unsigned long flags; - u32 tmp = 0; switch (which) { case QIB_IB_CFG_LIDLMC: @@ -2468,6 +2467,9 @@ static int qib_7220_set_ib_cfg(struct qib_pportdata *ppd, int which, u32 val) maskr = IBA7220_IBC_WIDTH_MASK; lsb = IBA7220_IBC_WIDTH_SHIFT; setforce = 1; + spin_lock_irqsave(&ppd->lflags_lock, flags); + ppd->lflags |= QIBL_IB_FORCE_NOTIFY; + spin_unlock_irqrestore(&ppd->lflags_lock, flags); break; case QIB_IB_CFG_SPD_ENB: /* set allowed Link speeds */ @@ -2641,28 +2643,6 @@ static int qib_7220_set_ib_cfg(struct qib_pportdata *ppd, int which, u32 val) goto bail; } qib_set_ib_7220_lstate(ppd, lcmd, licmd); - - maskr = IBA7220_IBC_WIDTH_MASK; - lsb = IBA7220_IBC_WIDTH_SHIFT; - tmp = (ppd->cpspec->ibcddrctrl >> lsb) & maskr; - /* If the width active on the chip does not match the - * width in the shadow register, write the new active - * width to the chip. - * We don't have to worry about speed as the speed is taken - * care of by set_7220_ibspeed_fast called by ib_updown. - */ - if (ppd->link_width_enabled-1 != tmp) { - ppd->cpspec->ibcddrctrl &= ~(maskr << lsb); - ppd->cpspec->ibcddrctrl |= - (((u64)(ppd->link_width_enabled-1) & maskr) << - lsb); - qib_write_kreg(dd, kr_ibcddrctrl, - ppd->cpspec->ibcddrctrl); - qib_write_kreg(dd, kr_scratch, 0); - spin_lock_irqsave(&ppd->lflags_lock, flags); - ppd->lflags |= QIBL_IB_FORCE_NOTIFY; - spin_unlock_irqrestore(&ppd->lflags_lock, flags); - } goto bail; case QIB_IB_CFG_HRTBT: /* set Heartbeat off/enable/auto */ diff --git a/trunk/drivers/infiniband/hw/qib/qib_iba7322.c b/trunk/drivers/infiniband/hw/qib/qib_iba7322.c index 5ea9ece23b33..8ec5237031a0 100644 --- a/trunk/drivers/infiniband/hw/qib/qib_iba7322.c +++ b/trunk/drivers/infiniband/hw/qib/qib_iba7322.c @@ -114,10 +114,6 @@ static ushort qib_singleport; module_param_named(singleport, qib_singleport, ushort, S_IRUGO); MODULE_PARM_DESC(singleport, "Use only IB port 1; more per-port buffer space"); -static ushort qib_krcvq01_no_msi; -module_param_named(krcvq01_no_msi, qib_krcvq01_no_msi, ushort, S_IRUGO); -MODULE_PARM_DESC(krcvq01_no_msi, "No MSI for kctx < 2"); - /* * Receive header queue sizes */ @@ -401,6 +397,7 @@ MODULE_PARM_DESC(txselect, \ #define crp_txdroppedpkt CREG_IDX(TxDroppedPktCnt) #define crp_txhdrerr CREG_IDX(TxHeadersErrCnt) #define crp_txlenerr CREG_IDX(TxLenErrCnt) +#define crp_txlenerr CREG_IDX(TxLenErrCnt) #define crp_txminmaxlenerr CREG_IDX(TxMaxMinLenErrCnt) #define crp_txsdmadesc CREG_IDX(TxSDmaDescCnt) #define crp_txunderrun CREG_IDX(TxUnderrunCnt) @@ -1110,9 +1107,9 @@ static inline u32 read_7322_creg32_port(const struct qib_pportdata *ppd, #define AUTONEG_TRIES 3 /* sequential retries to negotiate DDR */ #define HWE_AUTO(fldname) { .mask = SYM_MASK(HwErrMask, fldname##Mask), \ - .msg = #fldname , .sz = sizeof(#fldname) } + .msg = #fldname } #define HWE_AUTO_P(fldname, port) { .mask = SYM_MASK(HwErrMask, \ - fldname##Mask##_##port), .msg = #fldname , .sz = sizeof(#fldname) } + fldname##Mask##_##port), .msg = #fldname } static const struct qib_hwerror_msgs qib_7322_hwerror_msgs[] = { HWE_AUTO_P(IBSerdesPClkNotDetect, 1), HWE_AUTO_P(IBSerdesPClkNotDetect, 0), @@ -1130,16 +1127,14 @@ static const struct qib_hwerror_msgs qib_7322_hwerror_msgs[] = { HWE_AUTO_P(IBCBusFromSPCParityErr, 0), HWE_AUTO(statusValidNoEop), HWE_AUTO(LATriggered), - { .mask = 0, .sz = 0 } + { .mask = 0 } }; #define E_AUTO(fldname) { .mask = SYM_MASK(ErrMask, fldname##Mask), \ - .msg = #fldname, .sz = sizeof(#fldname) } + .msg = #fldname } #define E_P_AUTO(fldname) { .mask = SYM_MASK(ErrMask_0, fldname##Mask), \ - .msg = #fldname, .sz = sizeof(#fldname) } + .msg = #fldname } static const struct qib_hwerror_msgs qib_7322error_msgs[] = { - E_AUTO(RcvEgrFullErr), - E_AUTO(RcvHdrFullErr), E_AUTO(ResetNegated), E_AUTO(HardwareErr), E_AUTO(InvalidAddrErr), @@ -1152,7 +1147,9 @@ static const struct qib_hwerror_msgs qib_7322error_msgs[] = { E_AUTO(SendSpecialTriggerErr), E_AUTO(SDmaWrongPortErr), E_AUTO(SDmaBufMaskDuplicateErr), - { .mask = 0, .sz = 0 } + E_AUTO(RcvHdrFullErr), + E_AUTO(RcvEgrFullErr), + { .mask = 0 } }; static const struct qib_hwerror_msgs qib_7322p_error_msgs[] = { @@ -1162,8 +1159,7 @@ static const struct qib_hwerror_msgs qib_7322p_error_msgs[] = { /* * SDmaHaltErr is not really an error, make it clearer; */ - {.mask = SYM_MASK(ErrMask_0, SDmaHaltErrMask), .msg = "SDmaHalted", - .sz = 11}, + {.mask = SYM_MASK(ErrMask_0, SDmaHaltErrMask), .msg = "SDmaHalted"}, E_P_AUTO(SDmaDescAddrMisalignErr), E_P_AUTO(SDmaUnexpDataErr), E_P_AUTO(SDmaMissingDwErr), @@ -1199,7 +1195,7 @@ static const struct qib_hwerror_msgs qib_7322p_error_msgs[] = { E_P_AUTO(RcvICRCErr), E_P_AUTO(RcvVCRCErr), E_P_AUTO(RcvFormatErr), - { .mask = 0, .sz = 0 } + { .mask = 0 } }; /* @@ -1207,17 +1203,17 @@ static const struct qib_hwerror_msgs qib_7322p_error_msgs[] = { * context */ #define INTR_AUTO(fldname) { .mask = SYM_MASK(IntMask, fldname##Mask), \ - .msg = #fldname, .sz = sizeof(#fldname) } + .msg = #fldname } /* Below generates "auto-message" for interrupts specific to a port */ #define INTR_AUTO_P(fldname) { .mask = MASK_ACROSS(\ SYM_LSB(IntMask, fldname##Mask##_0), \ SYM_LSB(IntMask, fldname##Mask##_1)), \ - .msg = #fldname "_P", .sz = sizeof(#fldname "_P") } + .msg = #fldname "_P" } /* For some reason, the SerDesTrimDone bits are reversed */ #define INTR_AUTO_PI(fldname) { .mask = MASK_ACROSS(\ SYM_LSB(IntMask, fldname##Mask##_1), \ SYM_LSB(IntMask, fldname##Mask##_0)), \ - .msg = #fldname "_P", .sz = sizeof(#fldname "_P") } + .msg = #fldname "_P" } /* * Below generates "auto-message" for interrupts specific to a context, * with ctxt-number appended @@ -1225,7 +1221,7 @@ static const struct qib_hwerror_msgs qib_7322p_error_msgs[] = { #define INTR_AUTO_C(fldname) { .mask = MASK_ACROSS(\ SYM_LSB(IntMask, fldname##0IntMask), \ SYM_LSB(IntMask, fldname##17IntMask)), \ - .msg = #fldname "_C", .sz = sizeof(#fldname "_C") } + .msg = #fldname "_C"} static const struct qib_hwerror_msgs qib_7322_intr_msgs[] = { INTR_AUTO_P(SDmaInt), @@ -1239,12 +1235,11 @@ static const struct qib_hwerror_msgs qib_7322_intr_msgs[] = { INTR_AUTO_P(SendDoneInt), INTR_AUTO(SendBufAvailInt), INTR_AUTO_C(RcvAvail), - { .mask = 0, .sz = 0 } + { .mask = 0 } }; #define TXSYMPTOM_AUTO_P(fldname) \ - { .mask = SYM_MASK(SendHdrErrSymptom_0, fldname), \ - .msg = #fldname, .sz = sizeof(#fldname) } + { .mask = SYM_MASK(SendHdrErrSymptom_0, fldname), .msg = #fldname } static const struct qib_hwerror_msgs hdrchk_msgs[] = { TXSYMPTOM_AUTO_P(NonKeyPacket), TXSYMPTOM_AUTO_P(GRHFail), @@ -1253,7 +1248,7 @@ static const struct qib_hwerror_msgs hdrchk_msgs[] = { TXSYMPTOM_AUTO_P(SLIDFail), TXSYMPTOM_AUTO_P(RawIPV6), TXSYMPTOM_AUTO_P(PacketTooSmall), - { .mask = 0, .sz = 0 } + { .mask = 0 } }; #define IBA7322_HDRHEAD_PKTINT_SHIFT 32 /* interrupt cnt in upper 32 bits */ @@ -1298,7 +1293,7 @@ static void err_decode(char *msg, size_t len, u64 errs, u64 these, lmask; int took, multi, n = 0; - while (errs && msp && msp->mask) { + while (msp && msp->mask) { multi = (msp->mask & (msp->mask - 1)); while (errs & msp->mask) { these = (errs & msp->mask); @@ -1309,14 +1304,9 @@ static void err_decode(char *msg, size_t len, u64 errs, *msg++ = ','; len--; } - BUG_ON(!msp->sz); - /* msp->sz counts the nul */ - took = min_t(size_t, msp->sz - (size_t)1, len); - memcpy(msg, msp->msg, took); + took = scnprintf(msg, len, "%s", msp->msg); len -= took; msg += took; - if (len) - *msg = '\0'; } errs &= ~lmask; if (len && multi) { @@ -1654,14 +1644,6 @@ static noinline void handle_7322_errors(struct qib_devdata *dd) return; } -static void qib_error_tasklet(unsigned long data) -{ - struct qib_devdata *dd = (struct qib_devdata *)data; - - handle_7322_errors(dd); - qib_write_kreg(dd, kr_errmask, dd->cspec->errormask); -} - static void reenable_chase(unsigned long opaque) { struct qib_pportdata *ppd = (struct qib_pportdata *)opaque; @@ -2743,10 +2725,8 @@ static noinline void unlikely_7322_intr(struct qib_devdata *dd, u64 istat) unknown_7322_ibits(dd, istat); if (istat & QIB_I_GPIO) unknown_7322_gpio_intr(dd); - if (istat & QIB_I_C_ERROR) { - qib_write_kreg(dd, kr_errmask, 0ULL); - tasklet_schedule(&dd->error_tasklet); - } + if (istat & QIB_I_C_ERROR) + handle_7322_errors(dd); if (istat & INT_MASK_P(Err, 0) && dd->rcd[0]) handle_7322_p_errors(dd->rcd[0]->ppd); if (istat & INT_MASK_P(Err, 1) && dd->rcd[1]) @@ -3145,8 +3125,6 @@ static void qib_setup_7322_interrupt(struct qib_devdata *dd, int clearpend) arg = dd->rcd[ctxt]; if (!arg) continue; - if (qib_krcvq01_no_msi && ctxt < 2) - continue; lsb = QIB_I_RCVAVAIL_LSB + ctxt; handler = qib_7322pintr; name = QIB_DRV_NAME " (kctx)"; @@ -3181,8 +3159,6 @@ static void qib_setup_7322_interrupt(struct qib_devdata *dd, int clearpend) for (i = 0; i < ARRAY_SIZE(redirect); i++) qib_write_kreg(dd, kr_intredirect + i, redirect[i]); dd->cspec->main_int_mask = mask; - tasklet_init(&dd->error_tasklet, qib_error_tasklet, - (unsigned long)dd); bail:; } @@ -6812,10 +6788,6 @@ struct qib_devdata *qib_init_iba7322_funcs(struct pci_dev *pdev, (i >= ARRAY_SIZE(irq_table) && dd->rcd[i - ARRAY_SIZE(irq_table)])) actual_cnt++; - /* reduce by ctxt's < 2 */ - if (qib_krcvq01_no_msi) - actual_cnt -= dd->num_pports; - tabsize = actual_cnt; dd->cspec->msix_entries = kmalloc(tabsize * sizeof(struct msix_entry), GFP_KERNEL); diff --git a/trunk/drivers/infiniband/hw/qib/qib_pcie.c b/trunk/drivers/infiniband/hw/qib/qib_pcie.c index 4426782ad288..891cc2ff5f00 100644 --- a/trunk/drivers/infiniband/hw/qib/qib_pcie.c +++ b/trunk/drivers/infiniband/hw/qib/qib_pcie.c @@ -255,7 +255,7 @@ int qib_pcie_params(struct qib_devdata *dd, u32 minw, u32 *nent, u16 linkstat, speed; int pos = 0, pose, ret = 1; - pose = pci_pcie_cap(dd->pcidev); + pose = pci_find_capability(dd->pcidev, PCI_CAP_ID_EXP); if (!pose) { qib_dev_err(dd, "Can't find PCI Express capability!\n"); /* set up something... */ @@ -509,7 +509,7 @@ static int qib_tune_pcie_coalesce(struct qib_devdata *dd) qib_devinfo(dd->pcidev, "Parent not root\n"); return 1; } - ppos = pci_pcie_cap(parent); + ppos = pci_find_capability(parent, PCI_CAP_ID_EXP); if (!ppos) return 1; if (parent->vendor != 0x8086) @@ -578,14 +578,14 @@ static int qib_tune_pcie_caps(struct qib_devdata *dd) qib_devinfo(dd->pcidev, "Parent not root\n"); goto bail; } - ppos = pci_pcie_cap(parent); + ppos = pci_find_capability(parent, PCI_CAP_ID_EXP); if (ppos) { pci_read_config_word(parent, ppos + PCI_EXP_DEVCAP, &pcaps); pci_read_config_word(parent, ppos + PCI_EXP_DEVCTL, &pctl); } else goto bail; /* Find out supported and configured values for endpoint (us) */ - epos = pci_pcie_cap(dd->pcidev); + epos = pci_find_capability(dd->pcidev, PCI_CAP_ID_EXP); if (epos) { pci_read_config_word(dd->pcidev, epos + PCI_EXP_DEVCAP, &ecaps); pci_read_config_word(dd->pcidev, epos + PCI_EXP_DEVCTL, &ectl); diff --git a/trunk/drivers/infiniband/hw/qib/qib_sysfs.c b/trunk/drivers/infiniband/hw/qib/qib_sysfs.c index 14d129de4320..d50a33fe8bbc 100644 --- a/trunk/drivers/infiniband/hw/qib/qib_sysfs.c +++ b/trunk/drivers/infiniband/hw/qib/qib_sysfs.c @@ -507,18 +507,6 @@ static ssize_t show_nctxts(struct device *device, dd->first_user_ctxt); } -static ssize_t show_nfreectxts(struct device *device, - struct device_attribute *attr, char *buf) -{ - struct qib_ibdev *dev = - container_of(device, struct qib_ibdev, ibdev.dev); - struct qib_devdata *dd = dd_from_dev(dev); - - /* Return the number of free user ports (contexts) available. */ - return scnprintf(buf, PAGE_SIZE, "%u\n", dd->cfgctxts - - dd->first_user_ctxt - (u32)qib_stats.sps_ctxts); -} - static ssize_t show_serial(struct device *device, struct device_attribute *attr, char *buf) { @@ -616,7 +604,6 @@ static DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL); static DEVICE_ATTR(board_id, S_IRUGO, show_hca, NULL); static DEVICE_ATTR(version, S_IRUGO, show_version, NULL); static DEVICE_ATTR(nctxts, S_IRUGO, show_nctxts, NULL); -static DEVICE_ATTR(nfreectxts, S_IRUGO, show_nfreectxts, NULL); static DEVICE_ATTR(serial, S_IRUGO, show_serial, NULL); static DEVICE_ATTR(boardversion, S_IRUGO, show_boardversion, NULL); static DEVICE_ATTR(logged_errors, S_IRUGO, show_logged_errs, NULL); @@ -630,7 +617,6 @@ static struct device_attribute *qib_attributes[] = { &dev_attr_board_id, &dev_attr_version, &dev_attr_nctxts, - &dev_attr_nfreectxts, &dev_attr_serial, &dev_attr_boardversion, &dev_attr_logged_errors, diff --git a/trunk/drivers/infiniband/ulp/srp/ib_srp.c b/trunk/drivers/infiniband/ulp/srp/ib_srp.c index ee165fdcb596..7d5109bbd1ad 100644 --- a/trunk/drivers/infiniband/ulp/srp/ib_srp.c +++ b/trunk/drivers/infiniband/ulp/srp/ib_srp.c @@ -2127,6 +2127,8 @@ static ssize_t srp_create_target(struct device *dev, return -ENOMEM; target_host->transportt = ib_srp_transport_template; + target_host->max_channel = 0; + target_host->max_id = 1; target_host->max_lun = SRP_MAX_LUN; target_host->max_cmd_len = sizeof ((struct srp_cmd *) (void *) 0L)->cdb;