From dd9309184d22883b42da80afa99aad13f0207344 Mon Sep 17 00:00:00 2001 From: Tatyana Nikolova Date: Thu, 6 Dec 2012 19:56:31 +0000 Subject: [PATCH] --- yaml --- r: 343689 b: refs/heads/master c: 00ad255d17c2d12a035370836cb93630711d48ca h: refs/heads/master i: 343687: 66f1e54dd9022dc147a2d44ce74dc99ec1513d17 v: v3 --- [refs] | 2 +- .../ABI/stable/sysfs-driver-ib_srp | 156 --------- .../ABI/stable/sysfs-transport-srp | 19 -- trunk/drivers/infiniband/core/cma.c | 9 +- trunk/drivers/infiniband/hw/amso1100/c2_ae.c | 1 - trunk/drivers/infiniband/hw/cxgb3/iwch_cm.c | 6 +- trunk/drivers/infiniband/hw/cxgb4/cm.c | 6 +- .../infiniband/hw/ipath/ipath_init_chip.c | 10 + trunk/drivers/infiniband/hw/mlx4/cm.c | 4 +- trunk/drivers/infiniband/hw/mlx4/cq.c | 34 +- trunk/drivers/infiniband/hw/mlx4/main.c | 27 +- trunk/drivers/infiniband/hw/mlx4/mlx4_ib.h | 1 - trunk/drivers/infiniband/hw/mlx4/user.h | 12 +- trunk/drivers/infiniband/hw/nes/nes_cm.c | 24 +- trunk/drivers/infiniband/ulp/srp/ib_srp.c | 314 +++++++----------- trunk/drivers/infiniband/ulp/srp/ib_srp.h | 11 +- .../drivers/net/ethernet/mellanox/mlx4/cmd.c | 11 +- .../net/ethernet/mellanox/mlx4/en_cq.c | 2 +- .../net/ethernet/mellanox/mlx4/en_netdev.c | 1 - .../net/ethernet/mellanox/mlx4/en_rx.c | 5 +- .../net/ethernet/mellanox/mlx4/en_tx.c | 5 +- trunk/drivers/net/ethernet/mellanox/mlx4/eq.c | 36 +- trunk/drivers/net/ethernet/mellanox/mlx4/fw.c | 30 +- trunk/drivers/net/ethernet/mellanox/mlx4/fw.h | 1 - .../drivers/net/ethernet/mellanox/mlx4/main.c | 38 +-- .../net/ethernet/mellanox/mlx4/mlx4_en.h | 1 - trunk/drivers/scsi/scsi_transport_srp.c | 51 ++- trunk/include/linux/mlx4/device.h | 21 -- trunk/include/rdma/Kbuild | 6 + trunk/include/{uapi => }/rdma/ib_user_cm.h | 0 trunk/include/{uapi => }/rdma/ib_user_mad.h | 0 trunk/include/{uapi => }/rdma/ib_user_sa.h | 0 trunk/include/{uapi => }/rdma/ib_user_verbs.h | 0 trunk/include/rdma/rdma_netlink.h | 36 +- trunk/include/{uapi => }/rdma/rdma_user_cm.h | 0 trunk/include/scsi/scsi_transport_srp.h | 8 - trunk/include/uapi/rdma/Kbuild | 6 - trunk/include/uapi/rdma/rdma_netlink.h | 37 --- 38 files changed, 270 insertions(+), 661 deletions(-) delete mode 100644 trunk/Documentation/ABI/stable/sysfs-driver-ib_srp delete mode 100644 trunk/Documentation/ABI/stable/sysfs-transport-srp rename trunk/include/{uapi => }/rdma/ib_user_cm.h (100%) rename trunk/include/{uapi => }/rdma/ib_user_mad.h (100%) rename trunk/include/{uapi => }/rdma/ib_user_sa.h (100%) rename trunk/include/{uapi => }/rdma/ib_user_verbs.h (100%) rename trunk/include/{uapi => }/rdma/rdma_user_cm.h (100%) delete mode 100644 trunk/include/uapi/rdma/rdma_netlink.h diff --git a/[refs] b/[refs] index 6373f41cc7bf..2c7143180dad 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: fb57e1dbbd4a69aff759d5fd14a936d5260937b6 +refs/heads/master: 00ad255d17c2d12a035370836cb93630711d48ca diff --git a/trunk/Documentation/ABI/stable/sysfs-driver-ib_srp b/trunk/Documentation/ABI/stable/sysfs-driver-ib_srp deleted file mode 100644 index 481aae95c7d1..000000000000 --- a/trunk/Documentation/ABI/stable/sysfs-driver-ib_srp +++ /dev/null @@ -1,156 +0,0 @@ -What: /sys/class/infiniband_srp/srp--/add_target -Date: January 2, 2006 -KernelVersion: 2.6.15 -Contact: linux-rdma@vger.kernel.org -Description: Interface for making ib_srp connect to a new target. - One can request ib_srp to connect to a new target by writing - a comma-separated list of login parameters to this sysfs - attribute. The supported parameters are: - * id_ext, a 16-digit hexadecimal number specifying the eight - byte identifier extension in the 16-byte SRP target port - identifier. The target port identifier is sent by ib_srp - to the target in the SRP_LOGIN_REQ request. - * ioc_guid, a 16-digit hexadecimal number specifying the eight - byte I/O controller GUID portion of the 16-byte target port - identifier. - * dgid, a 32-digit hexadecimal number specifying the - destination GID. - * pkey, a four-digit hexadecimal number specifying the - InfiniBand partition key. - * service_id, a 16-digit hexadecimal number specifying the - InfiniBand service ID used to establish communication with - the SRP target. How to find out the value of the service ID - is specified in the documentation of the SRP target. - * max_sect, a decimal number specifying the maximum number of - 512-byte sectors to be transferred via a single SCSI command. - * max_cmd_per_lun, a decimal number specifying the maximum - number of outstanding commands for a single LUN. - * io_class, a hexadecimal number specifying the SRP I/O class. - Must be either 0xff00 (rev 10) or 0x0100 (rev 16a). The I/O - class defines the format of the SRP initiator and target - port identifiers. - * initiator_ext, a 16-digit hexadecimal number specifying the - identifier extension portion of the SRP initiator port - identifier. This data is sent by the initiator to the target - in the SRP_LOGIN_REQ request. - * cmd_sg_entries, a number in the range 1..255 that specifies - the maximum number of data buffer descriptors stored in the - SRP_CMD information unit itself. With allow_ext_sg=0 the - parameter cmd_sg_entries defines the maximum S/G list length - for a single SRP_CMD, and commands whose S/G list length - exceeds this limit after S/G list collapsing will fail. - * allow_ext_sg, whether ib_srp is allowed to include a partial - memory descriptor list in an SRP_CMD instead of the entire - list. If a partial memory descriptor list has been included - in an SRP_CMD the remaining memory descriptors are - communicated from initiator to target via an additional RDMA - transfer. Setting allow_ext_sg to 1 increases the maximum - amount of data that can be transferred between initiator and - target via a single SCSI command. Since not all SRP target - implementations support partial memory descriptor lists the - default value for this option is 0. - * sg_tablesize, a number in the range 1..2048 specifying the - maximum S/G list length the SCSI layer is allowed to pass to - ib_srp. Specifying a value that exceeds cmd_sg_entries is - only safe with partial memory descriptor list support enabled - (allow_ext_sg=1). - -What: /sys/class/infiniband_srp/srp--/ibdev -Date: January 2, 2006 -KernelVersion: 2.6.15 -Contact: linux-rdma@vger.kernel.org -Description: HCA name (). - -What: /sys/class/infiniband_srp/srp--/port -Date: January 2, 2006 -KernelVersion: 2.6.15 -Contact: linux-rdma@vger.kernel.org -Description: HCA port number (). - -What: /sys/class/scsi_host/host/allow_ext_sg -Date: May 19, 2011 -KernelVersion: 2.6.39 -Contact: linux-rdma@vger.kernel.org -Description: Whether ib_srp is allowed to include a partial memory - descriptor list in an SRP_CMD when communicating with an SRP - target. - -What: /sys/class/scsi_host/host/cmd_sg_entries -Date: May 19, 2011 -KernelVersion: 2.6.39 -Contact: linux-rdma@vger.kernel.org -Description: Maximum number of data buffer descriptors that may be sent to - the target in a single SRP_CMD request. - -What: /sys/class/scsi_host/host/dgid -Date: June 17, 2006 -KernelVersion: 2.6.17 -Contact: linux-rdma@vger.kernel.org -Description: InfiniBand destination GID used for communication with the SRP - target. Differs from orig_dgid if port redirection has happened. - -What: /sys/class/scsi_host/host/id_ext -Date: June 17, 2006 -KernelVersion: 2.6.17 -Contact: linux-rdma@vger.kernel.org -Description: Eight-byte identifier extension portion of the 16-byte target - port identifier. - -What: /sys/class/scsi_host/host/ioc_guid -Date: June 17, 2006 -KernelVersion: 2.6.17 -Contact: linux-rdma@vger.kernel.org -Description: Eight-byte I/O controller GUID portion of the 16-byte target - port identifier. - -What: /sys/class/scsi_host/host/local_ib_device -Date: November 29, 2006 -KernelVersion: 2.6.19 -Contact: linux-rdma@vger.kernel.org -Description: Name of the InfiniBand HCA used for communicating with the - SRP target. - -What: /sys/class/scsi_host/host/local_ib_port -Date: November 29, 2006 -KernelVersion: 2.6.19 -Contact: linux-rdma@vger.kernel.org -Description: Number of the HCA port used for communicating with the - SRP target. - -What: /sys/class/scsi_host/host/orig_dgid -Date: June 17, 2006 -KernelVersion: 2.6.17 -Contact: linux-rdma@vger.kernel.org -Description: InfiniBand destination GID specified in the parameters - written to the add_target sysfs attribute. - -What: /sys/class/scsi_host/host/pkey -Date: June 17, 2006 -KernelVersion: 2.6.17 -Contact: linux-rdma@vger.kernel.org -Description: A 16-bit number representing the InfiniBand partition key used - for communication with the SRP target. - -What: /sys/class/scsi_host/host/req_lim -Date: October 20, 2010 -KernelVersion: 2.6.36 -Contact: linux-rdma@vger.kernel.org -Description: Number of requests ib_srp can send to the target before it has - to wait for more credits. For more information see also the - SRP credit algorithm in the SRP specification. - -What: /sys/class/scsi_host/host/service_id -Date: June 17, 2006 -KernelVersion: 2.6.17 -Contact: linux-rdma@vger.kernel.org -Description: InfiniBand service ID used for establishing communication with - the SRP target. - -What: /sys/class/scsi_host/host/zero_req_lim -Date: September 20, 2006 -KernelVersion: 2.6.18 -Contact: linux-rdma@vger.kernel.org -Description: Number of times the initiator had to wait before sending a - request to the target because it ran out of credits. For more - information see also the SRP credit algorithm in the SRP - specification. diff --git a/trunk/Documentation/ABI/stable/sysfs-transport-srp b/trunk/Documentation/ABI/stable/sysfs-transport-srp deleted file mode 100644 index b36fb0dc13c8..000000000000 --- a/trunk/Documentation/ABI/stable/sysfs-transport-srp +++ /dev/null @@ -1,19 +0,0 @@ -What: /sys/class/srp_remote_ports/port-:/delete -Date: June 1, 2012 -KernelVersion: 3.7 -Contact: linux-scsi@vger.kernel.org, linux-rdma@vger.kernel.org -Description: Instructs an SRP initiator to disconnect from a target and to - remove all LUNs imported from that target. - -What: /sys/class/srp_remote_ports/port-:/port_id -Date: June 27, 2007 -KernelVersion: 2.6.24 -Contact: linux-scsi@vger.kernel.org -Description: 16-byte local SRP port identifier in hexadecimal format. An - example: 4c:49:4e:55:58:20:56:49:4f:00:00:00:00:00:00:00. - -What: /sys/class/srp_remote_ports/port-:/roles -Date: June 27, 2007 -KernelVersion: 2.6.24 -Contact: linux-scsi@vger.kernel.org -Description: Role of the remote port. Either "SRP Initiator" or "SRP Target". diff --git a/trunk/drivers/infiniband/core/cma.c b/trunk/drivers/infiniband/core/cma.c index d789eea32168..a7568c34a1aa 100644 --- a/trunk/drivers/infiniband/core/cma.c +++ b/trunk/drivers/infiniband/core/cma.c @@ -345,17 +345,17 @@ static int find_gid_port(struct ib_device *device, union ib_gid *gid, u8 port_nu err = ib_query_port(device, port_num, &props); if (err) - return err; + return 1; for (i = 0; i < props.gid_tbl_len; ++i) { err = ib_query_gid(device, port_num, i, &tmp); if (err) - return err; + return 1; if (!memcmp(&tmp, gid, sizeof tmp)) return 0; } - return -EADDRNOTAVAIL; + return -EAGAIN; } static int cma_acquire_dev(struct rdma_id_private *id_priv) @@ -388,7 +388,8 @@ static int cma_acquire_dev(struct rdma_id_private *id_priv) if (!ret) { id_priv->id.port_num = port; goto out; - } + } else if (ret == 1) + break; } } } diff --git a/trunk/drivers/infiniband/hw/amso1100/c2_ae.c b/trunk/drivers/infiniband/hw/amso1100/c2_ae.c index 706cf97cbe8f..32d34e88d5cf 100644 --- a/trunk/drivers/infiniband/hw/amso1100/c2_ae.c +++ b/trunk/drivers/infiniband/hw/amso1100/c2_ae.c @@ -311,7 +311,6 @@ void c2_ae_event(struct c2_dev *c2dev, u32 mq_index) if (cq->ibcq.event_handler) cq->ibcq.event_handler(&ib_event, cq->ibcq.cq_context); - break; } default: diff --git a/trunk/drivers/infiniband/hw/cxgb3/iwch_cm.c b/trunk/drivers/infiniband/hw/cxgb3/iwch_cm.c index 3e094cd6a0e3..aaf88ef9409c 100644 --- a/trunk/drivers/infiniband/hw/cxgb3/iwch_cm.c +++ b/trunk/drivers/infiniband/hw/cxgb3/iwch_cm.c @@ -128,8 +128,9 @@ static void stop_ep_timer(struct iwch_ep *ep) { PDBG("%s ep %p\n", __func__, ep); if (!timer_pending(&ep->timer)) { - WARN(1, "%s timer stopped when its not running! ep %p state %u\n", + printk(KERN_ERR "%s timer stopped when its not running! ep %p state %u\n", __func__, ep, ep->com.state); + WARN_ON(1); return; } del_timer_sync(&ep->timer); @@ -1755,8 +1756,9 @@ static void ep_timeout(unsigned long arg) __state_set(&ep->com, ABORTING); break; default: - WARN(1, "%s unexpected state ep %p state %u\n", + printk(KERN_ERR "%s unexpected state ep %p state %u\n", __func__, ep, ep->com.state); + WARN_ON(1); abort = 0; } spin_unlock_irqrestore(&ep->com.lock, flags); diff --git a/trunk/drivers/infiniband/hw/cxgb4/cm.c b/trunk/drivers/infiniband/hw/cxgb4/cm.c index 5de86968379d..6cfd4d8fd0bd 100644 --- a/trunk/drivers/infiniband/hw/cxgb4/cm.c +++ b/trunk/drivers/infiniband/hw/cxgb4/cm.c @@ -151,8 +151,9 @@ static void stop_ep_timer(struct c4iw_ep *ep) { PDBG("%s ep %p\n", __func__, ep); if (!timer_pending(&ep->timer)) { - WARN(1, "%s timer stopped when its not running! " + printk(KERN_ERR "%s timer stopped when its not running! " "ep %p state %u\n", __func__, ep, ep->com.state); + WARN_ON(1); return; } del_timer_sync(&ep->timer); @@ -2550,8 +2551,9 @@ static void process_timeout(struct c4iw_ep *ep) __state_set(&ep->com, ABORTING); break; default: - WARN(1, "%s unexpected state ep %p tid %u state %u\n", + printk(KERN_ERR "%s unexpected state ep %p tid %u state %u\n", __func__, ep, ep->hwtid, ep->com.state); + WARN_ON(1); abort = 0; } mutex_unlock(&ep->com.mutex); diff --git a/trunk/drivers/infiniband/hw/ipath/ipath_init_chip.c b/trunk/drivers/infiniband/hw/ipath/ipath_init_chip.c index be2a60e142b0..49b09c697c7c 100644 --- a/trunk/drivers/infiniband/hw/ipath/ipath_init_chip.c +++ b/trunk/drivers/infiniband/hw/ipath/ipath_init_chip.c @@ -718,6 +718,16 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit) if (ret) goto done; + /* + * we ignore most issues after reporting them, but have to specially + * handle hardware-disabled chips. + */ + if (ret == 2) { + /* unique error, known to ipath_init_one */ + ret = -EPERM; + goto done; + } + /* * We could bump this to allow for full rcvegrcnt + rcvtidcnt, * but then it no longer nicely fits power of two, and since diff --git a/trunk/drivers/infiniband/hw/mlx4/cm.c b/trunk/drivers/infiniband/hw/mlx4/cm.c index dbc99d41605c..80079e5a2e30 100644 --- a/trunk/drivers/infiniband/hw/mlx4/cm.c +++ b/trunk/drivers/infiniband/hw/mlx4/cm.c @@ -268,15 +268,15 @@ static void schedule_delayed(struct ib_device *ibdev, struct id_map_entry *id) struct mlx4_ib_sriov *sriov = &to_mdev(ibdev)->sriov; unsigned long flags; - spin_lock(&sriov->id_map_lock); spin_lock_irqsave(&sriov->going_down_lock, flags); + spin_lock(&sriov->id_map_lock); /*make sure that there is no schedule inside the scheduled work.*/ if (!sriov->is_going_down) { id->scheduled_delete = 1; schedule_delayed_work(&id->timeout, CM_CLEANUP_CACHE_TIMEOUT); } - spin_unlock_irqrestore(&sriov->going_down_lock, flags); spin_unlock(&sriov->id_map_lock); + spin_unlock_irqrestore(&sriov->going_down_lock, flags); } int mlx4_ib_multiplex_cm_handler(struct ib_device *ibdev, int port, int slave_id, diff --git a/trunk/drivers/infiniband/hw/mlx4/cq.c b/trunk/drivers/infiniband/hw/mlx4/cq.c index ae67df35dd4d..c9eb6a6815ce 100644 --- a/trunk/drivers/infiniband/hw/mlx4/cq.c +++ b/trunk/drivers/infiniband/hw/mlx4/cq.c @@ -66,7 +66,7 @@ static void mlx4_ib_cq_event(struct mlx4_cq *cq, enum mlx4_event type) static void *get_cqe_from_buf(struct mlx4_ib_cq_buf *buf, int n) { - return mlx4_buf_offset(&buf->buf, n * buf->entry_size); + return mlx4_buf_offset(&buf->buf, n * sizeof (struct mlx4_cqe)); } static void *get_cqe(struct mlx4_ib_cq *cq, int n) @@ -77,9 +77,8 @@ static void *get_cqe(struct mlx4_ib_cq *cq, int n) static void *get_sw_cqe(struct mlx4_ib_cq *cq, int n) { struct mlx4_cqe *cqe = get_cqe(cq, n & cq->ibcq.cqe); - struct mlx4_cqe *tcqe = ((cq->buf.entry_size == 64) ? (cqe + 1) : cqe); - return (!!(tcqe->owner_sr_opcode & MLX4_CQE_OWNER_MASK) ^ + return (!!(cqe->owner_sr_opcode & MLX4_CQE_OWNER_MASK) ^ !!(n & (cq->ibcq.cqe + 1))) ? NULL : cqe; } @@ -100,13 +99,12 @@ static int mlx4_ib_alloc_cq_buf(struct mlx4_ib_dev *dev, struct mlx4_ib_cq_buf * { int err; - err = mlx4_buf_alloc(dev->dev, nent * dev->dev->caps.cqe_size, + err = mlx4_buf_alloc(dev->dev, nent * sizeof(struct mlx4_cqe), PAGE_SIZE * 2, &buf->buf); if (err) goto out; - buf->entry_size = dev->dev->caps.cqe_size; err = mlx4_mtt_init(dev->dev, buf->buf.npages, buf->buf.page_shift, &buf->mtt); if (err) @@ -122,7 +120,8 @@ static int mlx4_ib_alloc_cq_buf(struct mlx4_ib_dev *dev, struct mlx4_ib_cq_buf * mlx4_mtt_cleanup(dev->dev, &buf->mtt); err_buf: - mlx4_buf_free(dev->dev, nent * buf->entry_size, &buf->buf); + mlx4_buf_free(dev->dev, nent * sizeof(struct mlx4_cqe), + &buf->buf); out: return err; @@ -130,7 +129,7 @@ static int mlx4_ib_alloc_cq_buf(struct mlx4_ib_dev *dev, struct mlx4_ib_cq_buf * static void mlx4_ib_free_cq_buf(struct mlx4_ib_dev *dev, struct mlx4_ib_cq_buf *buf, int cqe) { - mlx4_buf_free(dev->dev, (cqe + 1) * buf->entry_size, &buf->buf); + mlx4_buf_free(dev->dev, (cqe + 1) * sizeof(struct mlx4_cqe), &buf->buf); } static int mlx4_ib_get_cq_umem(struct mlx4_ib_dev *dev, struct ib_ucontext *context, @@ -138,9 +137,8 @@ static int mlx4_ib_get_cq_umem(struct mlx4_ib_dev *dev, struct ib_ucontext *cont u64 buf_addr, int cqe) { int err; - int cqe_size = dev->dev->caps.cqe_size; - *umem = ib_umem_get(context, buf_addr, cqe * cqe_size, + *umem = ib_umem_get(context, buf_addr, cqe * sizeof (struct mlx4_cqe), IB_ACCESS_LOCAL_WRITE, 1); if (IS_ERR(*umem)) return PTR_ERR(*umem); @@ -333,23 +331,16 @@ static void mlx4_ib_cq_resize_copy_cqes(struct mlx4_ib_cq *cq) { struct mlx4_cqe *cqe, *new_cqe; int i; - int cqe_size = cq->buf.entry_size; - int cqe_inc = cqe_size == 64 ? 1 : 0; i = cq->mcq.cons_index; cqe = get_cqe(cq, i & cq->ibcq.cqe); - cqe += cqe_inc; - while ((cqe->owner_sr_opcode & MLX4_CQE_OPCODE_MASK) != MLX4_CQE_OPCODE_RESIZE) { new_cqe = get_cqe_from_buf(&cq->resize_buf->buf, (i + 1) & cq->resize_buf->cqe); - memcpy(new_cqe, get_cqe(cq, i & cq->ibcq.cqe), cqe_size); - new_cqe += cqe_inc; - + memcpy(new_cqe, get_cqe(cq, i & cq->ibcq.cqe), sizeof(struct mlx4_cqe)); new_cqe->owner_sr_opcode = (cqe->owner_sr_opcode & ~MLX4_CQE_OWNER_MASK) | (((i + 1) & (cq->resize_buf->cqe + 1)) ? MLX4_CQE_OWNER_MASK : 0); cqe = get_cqe(cq, ++i & cq->ibcq.cqe); - cqe += cqe_inc; } ++cq->mcq.cons_index; } @@ -447,7 +438,6 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata) out: mutex_unlock(&cq->resize_mutex); - return err; } @@ -596,9 +586,6 @@ static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq, if (!cqe) return -EAGAIN; - if (cq->buf.entry_size == 64) - cqe++; - ++cq->mcq.cons_index; /* @@ -820,7 +807,6 @@ void __mlx4_ib_cq_clean(struct mlx4_ib_cq *cq, u32 qpn, struct mlx4_ib_srq *srq) int nfreed = 0; struct mlx4_cqe *cqe, *dest; u8 owner_bit; - int cqe_inc = cq->buf.entry_size == 64 ? 1 : 0; /* * First we need to find the current producer index, so we @@ -839,16 +825,12 @@ void __mlx4_ib_cq_clean(struct mlx4_ib_cq *cq, u32 qpn, struct mlx4_ib_srq *srq) */ while ((int) --prod_index - (int) cq->mcq.cons_index >= 0) { cqe = get_cqe(cq, prod_index & cq->ibcq.cqe); - cqe += cqe_inc; - if ((be32_to_cpu(cqe->vlan_my_qpn) & MLX4_CQE_QPN_MASK) == qpn) { if (srq && !(cqe->owner_sr_opcode & MLX4_CQE_IS_SEND_MASK)) mlx4_ib_free_srq_wqe(srq, be16_to_cpu(cqe->wqe_index)); ++nfreed; } else if (nfreed) { dest = get_cqe(cq, (prod_index + nfreed) & cq->ibcq.cqe); - dest += cqe_inc; - owner_bit = dest->owner_sr_opcode & MLX4_CQE_OWNER_MASK; memcpy(dest, cqe, sizeof *cqe); dest->owner_sr_opcode = owner_bit | diff --git a/trunk/drivers/infiniband/hw/mlx4/main.c b/trunk/drivers/infiniband/hw/mlx4/main.c index e7d81c0d1ac5..718ec6b2bad2 100644 --- a/trunk/drivers/infiniband/hw/mlx4/main.c +++ b/trunk/drivers/infiniband/hw/mlx4/main.c @@ -563,24 +563,15 @@ static struct ib_ucontext *mlx4_ib_alloc_ucontext(struct ib_device *ibdev, { struct mlx4_ib_dev *dev = to_mdev(ibdev); struct mlx4_ib_ucontext *context; - struct mlx4_ib_alloc_ucontext_resp_v3 resp_v3; struct mlx4_ib_alloc_ucontext_resp resp; int err; if (!dev->ib_active) return ERR_PTR(-EAGAIN); - if (ibdev->uverbs_abi_ver == MLX4_IB_UVERBS_NO_DEV_CAPS_ABI_VERSION) { - resp_v3.qp_tab_size = dev->dev->caps.num_qps; - resp_v3.bf_reg_size = dev->dev->caps.bf_reg_size; - resp_v3.bf_regs_per_page = dev->dev->caps.bf_regs_per_page; - } else { - resp.dev_caps = dev->dev->caps.userspace_caps; - resp.qp_tab_size = dev->dev->caps.num_qps; - resp.bf_reg_size = dev->dev->caps.bf_reg_size; - resp.bf_regs_per_page = dev->dev->caps.bf_regs_per_page; - resp.cqe_size = dev->dev->caps.cqe_size; - } + resp.qp_tab_size = dev->dev->caps.num_qps; + resp.bf_reg_size = dev->dev->caps.bf_reg_size; + resp.bf_regs_per_page = dev->dev->caps.bf_regs_per_page; context = kmalloc(sizeof *context, GFP_KERNEL); if (!context) @@ -595,11 +586,7 @@ static struct ib_ucontext *mlx4_ib_alloc_ucontext(struct ib_device *ibdev, INIT_LIST_HEAD(&context->db_page_list); mutex_init(&context->db_page_mutex); - if (ibdev->uverbs_abi_ver == MLX4_IB_UVERBS_NO_DEV_CAPS_ABI_VERSION) - err = ib_copy_to_udata(udata, &resp_v3, sizeof(resp_v3)); - else - err = ib_copy_to_udata(udata, &resp, sizeof(resp)); - + err = ib_copy_to_udata(udata, &resp, sizeof resp); if (err) { mlx4_uar_free(to_mdev(ibdev)->dev, &context->uar); kfree(context); @@ -1355,11 +1342,7 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) ibdev->ib_dev.num_comp_vectors = dev->caps.num_comp_vectors; ibdev->ib_dev.dma_device = &dev->pdev->dev; - if (dev->caps.userspace_caps) - ibdev->ib_dev.uverbs_abi_ver = MLX4_IB_UVERBS_ABI_VERSION; - else - ibdev->ib_dev.uverbs_abi_ver = MLX4_IB_UVERBS_NO_DEV_CAPS_ABI_VERSION; - + ibdev->ib_dev.uverbs_abi_ver = MLX4_IB_UVERBS_ABI_VERSION; ibdev->ib_dev.uverbs_cmd_mask = (1ull << IB_USER_VERBS_CMD_GET_CONTEXT) | (1ull << IB_USER_VERBS_CMD_QUERY_DEVICE) | diff --git a/trunk/drivers/infiniband/hw/mlx4/mlx4_ib.h b/trunk/drivers/infiniband/hw/mlx4/mlx4_ib.h index dcd845bc30f0..e04cbc9a54a5 100644 --- a/trunk/drivers/infiniband/hw/mlx4/mlx4_ib.h +++ b/trunk/drivers/infiniband/hw/mlx4/mlx4_ib.h @@ -90,7 +90,6 @@ struct mlx4_ib_xrcd { struct mlx4_ib_cq_buf { struct mlx4_buf buf; struct mlx4_mtt mtt; - int entry_size; }; struct mlx4_ib_cq_resize { diff --git a/trunk/drivers/infiniband/hw/mlx4/user.h b/trunk/drivers/infiniband/hw/mlx4/user.h index 07e6769ef43b..13beedeeef9f 100644 --- a/trunk/drivers/infiniband/hw/mlx4/user.h +++ b/trunk/drivers/infiniband/hw/mlx4/user.h @@ -40,9 +40,7 @@ * Increment this value if any changes that break userspace ABI * compatibility are made. */ - -#define MLX4_IB_UVERBS_NO_DEV_CAPS_ABI_VERSION 3 -#define MLX4_IB_UVERBS_ABI_VERSION 4 +#define MLX4_IB_UVERBS_ABI_VERSION 3 /* * Make sure that all structs defined in this file remain laid out so @@ -52,18 +50,10 @@ * instead. */ -struct mlx4_ib_alloc_ucontext_resp_v3 { - __u32 qp_tab_size; - __u16 bf_reg_size; - __u16 bf_regs_per_page; -}; - struct mlx4_ib_alloc_ucontext_resp { - __u32 dev_caps; __u32 qp_tab_size; __u16 bf_reg_size; __u16 bf_regs_per_page; - __u32 cqe_size; }; struct mlx4_ib_alloc_pd_resp { diff --git a/trunk/drivers/infiniband/hw/nes/nes_cm.c b/trunk/drivers/infiniband/hw/nes/nes_cm.c index feb41e74206b..22ea67eea5dc 100644 --- a/trunk/drivers/infiniband/hw/nes/nes_cm.c +++ b/trunk/drivers/infiniband/hw/nes/nes_cm.c @@ -669,7 +669,6 @@ int schedule_nes_timer(struct nes_cm_node *cm_node, struct sk_buff *skb, struct nes_cm_core *cm_core = cm_node->cm_core; struct nes_timer_entry *new_send; int ret = 0; - u32 was_timer_set; new_send = kzalloc(sizeof(*new_send), GFP_ATOMIC); if (!new_send) @@ -721,12 +720,8 @@ int schedule_nes_timer(struct nes_cm_node *cm_node, struct sk_buff *skb, } } - was_timer_set = timer_pending(&cm_core->tcp_timer); - - if (!was_timer_set) { - cm_core->tcp_timer.expires = new_send->timetosend; - add_timer(&cm_core->tcp_timer); - } + if (!timer_pending(&cm_core->tcp_timer)) + mod_timer(&cm_core->tcp_timer, new_send->timetosend); return ret; } @@ -944,10 +939,8 @@ static void nes_cm_timer_tick(unsigned long pass) } if (settimer) { - if (!timer_pending(&cm_core->tcp_timer)) { - cm_core->tcp_timer.expires = nexttimeout; - add_timer(&cm_core->tcp_timer); - } + if (!timer_pending(&cm_core->tcp_timer)) + mod_timer(&cm_core->tcp_timer, nexttimeout); } } @@ -1312,8 +1305,6 @@ static int mini_cm_del_listen(struct nes_cm_core *cm_core, static inline int mini_cm_accelerated(struct nes_cm_core *cm_core, struct nes_cm_node *cm_node) { - u32 was_timer_set; - cm_node->accelerated = 1; if (cm_node->accept_pend) { @@ -1323,11 +1314,8 @@ static inline int mini_cm_accelerated(struct nes_cm_core *cm_core, BUG_ON(atomic_read(&cm_node->listener->pend_accepts_cnt) < 0); } - was_timer_set = timer_pending(&cm_core->tcp_timer); - if (!was_timer_set) { - cm_core->tcp_timer.expires = jiffies + NES_SHORT_TIME; - add_timer(&cm_core->tcp_timer); - } + if (!timer_pending(&cm_core->tcp_timer)) + mod_timer(&cm_core->tcp_timer, (jiffies + NES_SHORT_TIME)); return 0; } diff --git a/trunk/drivers/infiniband/ulp/srp/ib_srp.c b/trunk/drivers/infiniband/ulp/srp/ib_srp.c index d5088ce78290..922d845f76b0 100644 --- a/trunk/drivers/infiniband/ulp/srp/ib_srp.c +++ b/trunk/drivers/infiniband/ulp/srp/ib_srp.c @@ -222,29 +222,27 @@ static int srp_new_cm_id(struct srp_target_port *target) static int srp_create_target_ib(struct srp_target_port *target) { struct ib_qp_init_attr *init_attr; - struct ib_cq *recv_cq, *send_cq; - struct ib_qp *qp; int ret; init_attr = kzalloc(sizeof *init_attr, GFP_KERNEL); if (!init_attr) return -ENOMEM; - recv_cq = ib_create_cq(target->srp_host->srp_dev->dev, - srp_recv_completion, NULL, target, SRP_RQ_SIZE, 0); - if (IS_ERR(recv_cq)) { - ret = PTR_ERR(recv_cq); + target->recv_cq = ib_create_cq(target->srp_host->srp_dev->dev, + srp_recv_completion, NULL, target, SRP_RQ_SIZE, 0); + if (IS_ERR(target->recv_cq)) { + ret = PTR_ERR(target->recv_cq); goto err; } - send_cq = ib_create_cq(target->srp_host->srp_dev->dev, - srp_send_completion, NULL, target, SRP_SQ_SIZE, 0); - if (IS_ERR(send_cq)) { - ret = PTR_ERR(send_cq); + target->send_cq = ib_create_cq(target->srp_host->srp_dev->dev, + srp_send_completion, NULL, target, SRP_SQ_SIZE, 0); + if (IS_ERR(target->send_cq)) { + ret = PTR_ERR(target->send_cq); goto err_recv_cq; } - ib_req_notify_cq(recv_cq, IB_CQ_NEXT_COMP); + ib_req_notify_cq(target->recv_cq, IB_CQ_NEXT_COMP); init_attr->event_handler = srp_qp_event; init_attr->cap.max_send_wr = SRP_SQ_SIZE; @@ -253,41 +251,30 @@ static int srp_create_target_ib(struct srp_target_port *target) init_attr->cap.max_send_sge = 1; init_attr->sq_sig_type = IB_SIGNAL_ALL_WR; init_attr->qp_type = IB_QPT_RC; - init_attr->send_cq = send_cq; - init_attr->recv_cq = recv_cq; + init_attr->send_cq = target->send_cq; + init_attr->recv_cq = target->recv_cq; - qp = ib_create_qp(target->srp_host->srp_dev->pd, init_attr); - if (IS_ERR(qp)) { - ret = PTR_ERR(qp); + target->qp = ib_create_qp(target->srp_host->srp_dev->pd, init_attr); + if (IS_ERR(target->qp)) { + ret = PTR_ERR(target->qp); goto err_send_cq; } - ret = srp_init_qp(target, qp); + ret = srp_init_qp(target, target->qp); if (ret) goto err_qp; - if (target->qp) - ib_destroy_qp(target->qp); - if (target->recv_cq) - ib_destroy_cq(target->recv_cq); - if (target->send_cq) - ib_destroy_cq(target->send_cq); - - target->qp = qp; - target->recv_cq = recv_cq; - target->send_cq = send_cq; - kfree(init_attr); return 0; err_qp: - ib_destroy_qp(qp); + ib_destroy_qp(target->qp); err_send_cq: - ib_destroy_cq(send_cq); + ib_destroy_cq(target->send_cq); err_recv_cq: - ib_destroy_cq(recv_cq); + ib_destroy_cq(target->recv_cq); err: kfree(init_attr); @@ -302,9 +289,6 @@ static void srp_free_target_ib(struct srp_target_port *target) ib_destroy_cq(target->send_cq); ib_destroy_cq(target->recv_cq); - target->qp = NULL; - target->send_cq = target->recv_cq = NULL; - for (i = 0; i < SRP_RQ_SIZE; ++i) srp_free_iu(target->srp_host, target->rx_ring[i]); for (i = 0; i < SRP_SQ_SIZE; ++i) @@ -444,50 +428,34 @@ static int srp_send_req(struct srp_target_port *target) return status; } -static bool srp_queue_remove_work(struct srp_target_port *target) +static void srp_disconnect_target(struct srp_target_port *target) { - bool changed = false; + /* XXX should send SRP_I_LOGOUT request */ - spin_lock_irq(&target->lock); - if (target->state != SRP_TARGET_REMOVED) { - target->state = SRP_TARGET_REMOVED; - changed = true; + init_completion(&target->done); + if (ib_send_cm_dreq(target->cm_id, NULL, 0)) { + shost_printk(KERN_DEBUG, target->scsi_host, + PFX "Sending CM DREQ failed\n"); + return; } - spin_unlock_irq(&target->lock); - - if (changed) - queue_work(system_long_wq, &target->remove_work); - - return changed; + wait_for_completion(&target->done); } -static bool srp_change_conn_state(struct srp_target_port *target, - bool connected) +static bool srp_change_state(struct srp_target_port *target, + enum srp_target_state old, + enum srp_target_state new) { bool changed = false; spin_lock_irq(&target->lock); - if (target->connected != connected) { - target->connected = connected; + if (target->state == old) { + target->state = new; changed = true; } spin_unlock_irq(&target->lock); - return changed; } -static void srp_disconnect_target(struct srp_target_port *target) -{ - if (srp_change_conn_state(target, false)) { - /* XXX should send SRP_I_LOGOUT request */ - - if (ib_send_cm_dreq(target->cm_id, NULL, 0)) { - shost_printk(KERN_DEBUG, target->scsi_host, - PFX "Sending CM DREQ failed\n"); - } - } -} - static void srp_free_req_data(struct srp_target_port *target) { struct ib_device *ibdev = target->srp_host->srp_dev->dev; @@ -521,39 +489,25 @@ static void srp_del_scsi_host_attr(struct Scsi_Host *shost) device_remove_file(&shost->shost_dev, *attr); } -static void srp_remove_target(struct srp_target_port *target) -{ - WARN_ON_ONCE(target->state != SRP_TARGET_REMOVED); - - srp_del_scsi_host_attr(target->scsi_host); - srp_remove_host(target->scsi_host); - scsi_remove_host(target->scsi_host); - srp_disconnect_target(target); - ib_destroy_cm_id(target->cm_id); - srp_free_target_ib(target); - srp_free_req_data(target); - scsi_host_put(target->scsi_host); -} - static void srp_remove_work(struct work_struct *work) { struct srp_target_port *target = - container_of(work, struct srp_target_port, remove_work); + container_of(work, struct srp_target_port, work); - WARN_ON_ONCE(target->state != SRP_TARGET_REMOVED); + if (!srp_change_state(target, SRP_TARGET_DEAD, SRP_TARGET_REMOVED)) + return; spin_lock(&target->srp_host->target_lock); list_del(&target->list); spin_unlock(&target->srp_host->target_lock); - srp_remove_target(target); -} - -static void srp_rport_delete(struct srp_rport *rport) -{ - struct srp_target_port *target = rport->lld_data; - - srp_queue_remove_work(target); + srp_del_scsi_host_attr(target->scsi_host); + srp_remove_host(target->scsi_host); + scsi_remove_host(target->scsi_host); + ib_destroy_cm_id(target->cm_id); + srp_free_target_ib(target); + srp_free_req_data(target); + scsi_host_put(target->scsi_host); } static int srp_connect_target(struct srp_target_port *target) @@ -561,10 +515,6 @@ static int srp_connect_target(struct srp_target_port *target) int retries = 3; int ret; - WARN_ON_ONCE(target->connected); - - target->qp_in_error = false; - ret = srp_lookup_path(target); if (ret) return ret; @@ -584,7 +534,6 @@ static int srp_connect_target(struct srp_target_port *target) */ switch (target->status) { case 0: - srp_change_conn_state(target, true); return 0; case SRP_PORT_REDIRECT: @@ -697,14 +646,13 @@ static void srp_reset_req(struct srp_target_port *target, struct srp_request *re static int srp_reconnect_target(struct srp_target_port *target) { - struct Scsi_Host *shost = target->scsi_host; + struct ib_qp_attr qp_attr; + struct ib_wc wc; int i, ret; - if (target->state != SRP_TARGET_LIVE) + if (!srp_change_state(target, SRP_TARGET_LIVE, SRP_TARGET_CONNECTING)) return -EAGAIN; - scsi_target_block(&shost->shost_gendev); - srp_disconnect_target(target); /* * Now get a new local CM ID so that we avoid confusing the @@ -712,11 +660,21 @@ static int srp_reconnect_target(struct srp_target_port *target) */ ret = srp_new_cm_id(target); if (ret) - goto unblock; + goto err; - ret = srp_create_target_ib(target); + qp_attr.qp_state = IB_QPS_RESET; + ret = ib_modify_qp(target->qp, &qp_attr, IB_QP_STATE); if (ret) - goto unblock; + goto err; + + ret = srp_init_qp(target, target->qp); + if (ret) + goto err; + + while (ib_poll_cq(target->recv_cq, 1, &wc) > 0) + ; /* nothing */ + while (ib_poll_cq(target->send_cq, 1, &wc) > 0) + ; /* nothing */ for (i = 0; i < SRP_CMD_SQ_SIZE; ++i) { struct srp_request *req = &target->req_ring[i]; @@ -728,16 +686,13 @@ static int srp_reconnect_target(struct srp_target_port *target) for (i = 0; i < SRP_SQ_SIZE; ++i) list_add(&target->tx_ring[i]->list, &target->free_tx); + target->qp_in_error = 0; ret = srp_connect_target(target); - -unblock: - scsi_target_unblock(&shost->shost_gendev, ret == 0 ? SDEV_RUNNING : - SDEV_TRANSPORT_OFFLINE); - if (ret) goto err; - shost_printk(KERN_INFO, target->scsi_host, PFX "reconnect succeeded\n"); + if (!srp_change_state(target, SRP_TARGET_CONNECTING, SRP_TARGET_LIVE)) + ret = -EAGAIN; return ret; @@ -750,8 +705,17 @@ static int srp_reconnect_target(struct srp_target_port *target) * However, we have to defer the real removal because we * are in the context of the SCSI error handler now, which * will deadlock if we call scsi_remove_host(). + * + * Schedule our work inside the lock to avoid a race with + * the flush_scheduled_work() in srp_remove_one(). */ - srp_queue_remove_work(target); + spin_lock_irq(&target->lock); + if (target->state == SRP_TARGET_CONNECTING) { + target->state = SRP_TARGET_DEAD; + INIT_WORK(&target->work, srp_remove_work); + queue_work(ib_wq, &target->work); + } + spin_unlock_irq(&target->lock); return ret; } @@ -1298,19 +1262,6 @@ static void srp_handle_recv(struct srp_target_port *target, struct ib_wc *wc) PFX "Recv failed with error code %d\n", res); } -static void srp_handle_qp_err(enum ib_wc_status wc_status, - enum ib_wc_opcode wc_opcode, - struct srp_target_port *target) -{ - if (target->connected && !target->qp_in_error) { - shost_printk(KERN_ERR, target->scsi_host, - PFX "failed %s status %d\n", - wc_opcode & IB_WC_RECV ? "receive" : "send", - wc_status); - } - target->qp_in_error = true; -} - static void srp_recv_completion(struct ib_cq *cq, void *target_ptr) { struct srp_target_port *target = target_ptr; @@ -1318,11 +1269,15 @@ static void srp_recv_completion(struct ib_cq *cq, void *target_ptr) ib_req_notify_cq(cq, IB_CQ_NEXT_COMP); while (ib_poll_cq(cq, 1, &wc) > 0) { - if (likely(wc.status == IB_WC_SUCCESS)) { - srp_handle_recv(target, &wc); - } else { - srp_handle_qp_err(wc.status, wc.opcode, target); + if (wc.status) { + shost_printk(KERN_ERR, target->scsi_host, + PFX "failed receive status %d\n", + wc.status); + target->qp_in_error = 1; + break; } + + srp_handle_recv(target, &wc); } } @@ -1333,12 +1288,16 @@ static void srp_send_completion(struct ib_cq *cq, void *target_ptr) struct srp_iu *iu; while (ib_poll_cq(cq, 1, &wc) > 0) { - if (likely(wc.status == IB_WC_SUCCESS)) { - iu = (struct srp_iu *) (uintptr_t) wc.wr_id; - list_add(&iu->list, &target->free_tx); - } else { - srp_handle_qp_err(wc.status, wc.opcode, target); + if (wc.status) { + shost_printk(KERN_ERR, target->scsi_host, + PFX "failed send status %d\n", + wc.status); + target->qp_in_error = 1; + break; } + + iu = (struct srp_iu *) (uintptr_t) wc.wr_id; + list_add(&iu->list, &target->free_tx); } } @@ -1352,6 +1311,16 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd) unsigned long flags; int len; + if (target->state == SRP_TARGET_CONNECTING) + goto err; + + if (target->state == SRP_TARGET_DEAD || + target->state == SRP_TARGET_REMOVED) { + scmnd->result = DID_BAD_TARGET << 16; + scmnd->scsi_done(scmnd); + return 0; + } + spin_lock_irqsave(&target->lock, flags); iu = __srp_get_tx_iu(target, SRP_IU_CMD); if (!iu) @@ -1408,6 +1377,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd) err_unlock: spin_unlock_irqrestore(&target->lock, flags); +err: return SCSI_MLQUEUE_HOST_BUSY; } @@ -1449,33 +1419,6 @@ static int srp_alloc_iu_bufs(struct srp_target_port *target) return -ENOMEM; } -static uint32_t srp_compute_rq_tmo(struct ib_qp_attr *qp_attr, int attr_mask) -{ - uint64_t T_tr_ns, max_compl_time_ms; - uint32_t rq_tmo_jiffies; - - /* - * According to section 11.2.4.2 in the IBTA spec (Modify Queue Pair, - * table 91), both the QP timeout and the retry count have to be set - * for RC QP's during the RTR to RTS transition. - */ - WARN_ON_ONCE((attr_mask & (IB_QP_TIMEOUT | IB_QP_RETRY_CNT)) != - (IB_QP_TIMEOUT | IB_QP_RETRY_CNT)); - - /* - * Set target->rq_tmo_jiffies to one second more than the largest time - * it can take before an error completion is generated. See also - * C9-140..142 in the IBTA spec for more information about how to - * convert the QP Local ACK Timeout value to nanoseconds. - */ - T_tr_ns = 4096 * (1ULL << qp_attr->timeout); - max_compl_time_ms = qp_attr->retry_cnt * 4 * T_tr_ns; - do_div(max_compl_time_ms, NSEC_PER_MSEC); - rq_tmo_jiffies = msecs_to_jiffies(max_compl_time_ms + 1000); - - return rq_tmo_jiffies; -} - static void srp_cm_rep_handler(struct ib_cm_id *cm_id, struct srp_login_rsp *lrsp, struct srp_target_port *target) @@ -1535,8 +1478,6 @@ static void srp_cm_rep_handler(struct ib_cm_id *cm_id, if (ret) goto error_free; - target->rq_tmo_jiffies = srp_compute_rq_tmo(qp_attr, attr_mask); - ret = ib_modify_qp(target->qp, qp_attr, attr_mask); if (ret) goto error_free; @@ -1658,7 +1599,6 @@ static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event) case IB_CM_DREQ_RECEIVED: shost_printk(KERN_WARNING, target->scsi_host, PFX "DREQ received - connection closed\n"); - srp_change_conn_state(target, false); if (ib_send_cm_drep(cm_id, NULL, 0)) shost_printk(KERN_ERR, target->scsi_host, PFX "Sending CM DREP failed\n"); @@ -1668,6 +1608,7 @@ static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event) shost_printk(KERN_ERR, target->scsi_host, PFX "connection closed\n"); + comp = 1; target->status = 0; break; @@ -1695,6 +1636,10 @@ static int srp_send_tsk_mgmt(struct srp_target_port *target, struct srp_iu *iu; struct srp_tsk_mgmt *tsk_mgmt; + if (target->state == SRP_TARGET_DEAD || + target->state == SRP_TARGET_REMOVED) + return -1; + init_completion(&target->tsk_mgmt_done); spin_lock_irq(&target->lock); @@ -1784,21 +1729,6 @@ static int srp_reset_host(struct scsi_cmnd *scmnd) return ret; } -static int srp_slave_configure(struct scsi_device *sdev) -{ - struct Scsi_Host *shost = sdev->host; - struct srp_target_port *target = host_to_target(shost); - struct request_queue *q = sdev->request_queue; - unsigned long timeout; - - if (sdev->type == TYPE_DISK) { - timeout = max_t(unsigned, 30 * HZ, target->rq_tmo_jiffies); - blk_queue_rq_timeout(q, timeout); - } - - return 0; -} - static ssize_t show_id_ext(struct device *dev, struct device_attribute *attr, char *buf) { @@ -1931,7 +1861,6 @@ static struct scsi_host_template srp_template = { .module = THIS_MODULE, .name = "InfiniBand SRP initiator", .proc_name = DRV_NAME, - .slave_configure = srp_slave_configure, .info = srp_target_info, .queuecommand = srp_queuecommand, .eh_abort_handler = srp_abort, @@ -1965,14 +1894,11 @@ static int srp_add_target(struct srp_host *host, struct srp_target_port *target) return PTR_ERR(rport); } - rport->lld_data = target; - spin_lock(&host->target_lock); list_add_tail(&target->list, &host->target_list); spin_unlock(&host->target_lock); target->state = SRP_TARGET_LIVE; - target->connected = false; scsi_scan_target(&target->scsi_host->shost_gendev, 0, target->scsi_id, SCAN_WILD_CARD, 0); @@ -2262,7 +2188,6 @@ static ssize_t srp_create_target(struct device *dev, sizeof (struct srp_indirect_buf) + target->cmd_sg_cnt * sizeof (struct srp_direct_buf); - INIT_WORK(&target->remove_work, srp_remove_work); spin_lock_init(&target->lock); INIT_LIST_HEAD(&target->free_tx); INIT_LIST_HEAD(&target->free_reqs); @@ -2307,6 +2232,7 @@ static ssize_t srp_create_target(struct device *dev, if (ret) goto err_free_ib; + target->qp_in_error = 0; ret = srp_connect_target(target); if (ret) { shost_printk(KERN_ERR, target->scsi_host, @@ -2496,7 +2422,8 @@ static void srp_remove_one(struct ib_device *device) { struct srp_device *srp_dev; struct srp_host *host, *tmp_host; - struct srp_target_port *target; + LIST_HEAD(target_list); + struct srp_target_port *target, *tmp_target; srp_dev = ib_get_client_data(device, &srp_client); @@ -2509,17 +2436,35 @@ static void srp_remove_one(struct ib_device *device) wait_for_completion(&host->released); /* - * Remove all target ports. + * Mark all target ports as removed, so we stop queueing + * commands and don't try to reconnect. */ spin_lock(&host->target_lock); - list_for_each_entry(target, &host->target_list, list) - srp_queue_remove_work(target); + list_for_each_entry(target, &host->target_list, list) { + spin_lock_irq(&target->lock); + target->state = SRP_TARGET_REMOVED; + spin_unlock_irq(&target->lock); + } spin_unlock(&host->target_lock); /* - * Wait for target port removal tasks. + * Wait for any reconnection tasks that may have + * started before we marked our target ports as + * removed, and any target port removal tasks. */ - flush_workqueue(system_long_wq); + flush_workqueue(ib_wq); + + list_for_each_entry_safe(target, tmp_target, + &host->target_list, list) { + srp_del_scsi_host_attr(target->scsi_host); + srp_remove_host(target->scsi_host); + scsi_remove_host(target->scsi_host); + srp_disconnect_target(target); + ib_destroy_cm_id(target->cm_id); + srp_free_target_ib(target); + srp_free_req_data(target); + scsi_host_put(target->scsi_host); + } kfree(host); } @@ -2533,7 +2478,6 @@ static void srp_remove_one(struct ib_device *device) } static struct srp_function_template ib_srp_transport_functions = { - .rport_delete = srp_rport_delete, }; static int __init srp_init_module(void) diff --git a/trunk/drivers/infiniband/ulp/srp/ib_srp.h b/trunk/drivers/infiniband/ulp/srp/ib_srp.h index de2d0b3c0bfe..020caf0c3789 100644 --- a/trunk/drivers/infiniband/ulp/srp/ib_srp.h +++ b/trunk/drivers/infiniband/ulp/srp/ib_srp.h @@ -80,7 +80,9 @@ enum { enum srp_target_state { SRP_TARGET_LIVE, - SRP_TARGET_REMOVED, + SRP_TARGET_CONNECTING, + SRP_TARGET_DEAD, + SRP_TARGET_REMOVED }; enum srp_iu_type { @@ -161,9 +163,6 @@ struct srp_target_port { struct ib_sa_query *path_query; int path_query_id; - u32 rq_tmo_jiffies; - bool connected; - struct ib_cm_id *cm_id; int max_ti_iu_len; @@ -174,12 +173,12 @@ struct srp_target_port { struct srp_iu *rx_ring[SRP_RQ_SIZE]; struct srp_request req_ring[SRP_CMD_SQ_SIZE]; - struct work_struct remove_work; + struct work_struct work; struct list_head list; struct completion done; int status; - bool qp_in_error; + int qp_in_error; struct completion tsk_mgmt_done; u8 tsk_mgmt_status; diff --git a/trunk/drivers/net/ethernet/mellanox/mlx4/cmd.c b/trunk/drivers/net/ethernet/mellanox/mlx4/cmd.c index fdc5f23d8e9f..3d1899ff1076 100644 --- a/trunk/drivers/net/ethernet/mellanox/mlx4/cmd.c +++ b/trunk/drivers/net/ethernet/mellanox/mlx4/cmd.c @@ -1498,7 +1498,6 @@ static void mlx4_master_do_cmd(struct mlx4_dev *dev, int slave, u8 cmd, u32 reply; u8 is_going_down = 0; int i; - unsigned long flags; slave_state[slave].comm_toggle ^= 1; reply = (u32) slave_state[slave].comm_toggle << 31; @@ -1577,12 +1576,12 @@ static void mlx4_master_do_cmd(struct mlx4_dev *dev, int slave, u8 cmd, mlx4_warn(dev, "Bad comm cmd:%d from slave:%d\n", cmd, slave); goto reset_slave; } - spin_lock_irqsave(&priv->mfunc.master.slave_state_lock, flags); + spin_lock(&priv->mfunc.master.slave_state_lock); if (!slave_state[slave].is_slave_going_down) slave_state[slave].last_cmd = cmd; else is_going_down = 1; - spin_unlock_irqrestore(&priv->mfunc.master.slave_state_lock, flags); + spin_unlock(&priv->mfunc.master.slave_state_lock); if (is_going_down) { mlx4_warn(dev, "Slave is going down aborting command(%d)" " executing from slave:%d\n", @@ -1598,10 +1597,10 @@ static void mlx4_master_do_cmd(struct mlx4_dev *dev, int slave, u8 cmd, reset_slave: /* cleanup any slave resources */ mlx4_delete_all_resources_for_slave(dev, slave); - spin_lock_irqsave(&priv->mfunc.master.slave_state_lock, flags); + spin_lock(&priv->mfunc.master.slave_state_lock); if (!slave_state[slave].is_slave_going_down) slave_state[slave].last_cmd = MLX4_COMM_CMD_RESET; - spin_unlock_irqrestore(&priv->mfunc.master.slave_state_lock, flags); + spin_unlock(&priv->mfunc.master.slave_state_lock); /*with slave in the middle of flr, no need to clean resources again.*/ inform_slave_state: memset(&slave_state[slave].event_eq, 0, @@ -1756,7 +1755,7 @@ int mlx4_multi_func_init(struct mlx4_dev *dev) spin_lock_init(&s_state->lock); } - memset(&priv->mfunc.master.cmd_eqe, 0, dev->caps.eqe_size); + memset(&priv->mfunc.master.cmd_eqe, 0, sizeof(struct mlx4_eqe)); priv->mfunc.master.cmd_eqe.type = MLX4_EVENT_TYPE_CMD; INIT_WORK(&priv->mfunc.master.comm_work, mlx4_master_comm_channel); diff --git a/trunk/drivers/net/ethernet/mellanox/mlx4/en_cq.c b/trunk/drivers/net/ethernet/mellanox/mlx4/en_cq.c index b8d0854a7ad1..aa9c2f6cf3c0 100644 --- a/trunk/drivers/net/ethernet/mellanox/mlx4/en_cq.c +++ b/trunk/drivers/net/ethernet/mellanox/mlx4/en_cq.c @@ -51,7 +51,7 @@ int mlx4_en_create_cq(struct mlx4_en_priv *priv, int err; cq->size = entries; - cq->buf_size = cq->size * mdev->dev->caps.cqe_size; + cq->buf_size = cq->size * sizeof(struct mlx4_cqe); cq->ring = ring; cq->is_tx = mode; diff --git a/trunk/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/trunk/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index 93a325669582..edd9cb8d3e1d 100644 --- a/trunk/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/trunk/drivers/net/ethernet/mellanox/mlx4/en_netdev.c @@ -1600,7 +1600,6 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, goto out; } priv->rx_ring_num = prof->rx_ring_num; - priv->cqe_factor = (mdev->dev->caps.cqe_size == 64) ? 1 : 0; priv->mac_index = -1; priv->msg_enable = MLX4_EN_MSG_LEVEL; spin_lock_init(&priv->stats_lock); diff --git a/trunk/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/trunk/drivers/net/ethernet/mellanox/mlx4/en_rx.c index 6fa106f6c0ec..5aba5ecdf1e2 100644 --- a/trunk/drivers/net/ethernet/mellanox/mlx4/en_rx.c +++ b/trunk/drivers/net/ethernet/mellanox/mlx4/en_rx.c @@ -566,7 +566,6 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud struct ethhdr *ethh; dma_addr_t dma; u64 s_mac; - int factor = priv->cqe_factor; if (!priv->port_up) return 0; @@ -575,7 +574,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud * descriptor offset can be deduced from the CQE index instead of * reading 'cqe->index' */ index = cq->mcq.cons_index & ring->size_mask; - cqe = &cq->buf[(index << factor) + factor]; + cqe = &cq->buf[index]; /* Process all completed CQEs */ while (XNOR(cqe->owner_sr_opcode & MLX4_CQE_OWNER_MASK, @@ -710,7 +709,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud ++cq->mcq.cons_index; index = (cq->mcq.cons_index) & ring->size_mask; - cqe = &cq->buf[(index << factor) + factor]; + cqe = &cq->buf[index]; if (++polled == budget) { /* We are here because we reached the NAPI budget - * flush only pending LRO sessions */ diff --git a/trunk/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/trunk/drivers/net/ethernet/mellanox/mlx4/en_tx.c index 25c157abdd92..b35094c590ba 100644 --- a/trunk/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/trunk/drivers/net/ethernet/mellanox/mlx4/en_tx.c @@ -315,13 +315,12 @@ static void mlx4_en_process_tx_cq(struct net_device *dev, struct mlx4_en_cq *cq) struct mlx4_cqe *buf = cq->buf; u32 packets = 0; u32 bytes = 0; - int factor = priv->cqe_factor; if (!priv->port_up) return; index = cons_index & size_mask; - cqe = &buf[(index << factor) + factor]; + cqe = &buf[index]; ring_index = ring->cons & size_mask; /* Process all completed CQEs */ @@ -350,7 +349,7 @@ static void mlx4_en_process_tx_cq(struct net_device *dev, struct mlx4_en_cq *cq) ++cons_index; index = cons_index & size_mask; - cqe = &buf[(index << factor) + factor]; + cqe = &buf[index]; } diff --git a/trunk/drivers/net/ethernet/mellanox/mlx4/eq.c b/trunk/drivers/net/ethernet/mellanox/mlx4/eq.c index 3cb7727408e5..b84a88bc44dc 100644 --- a/trunk/drivers/net/ethernet/mellanox/mlx4/eq.c +++ b/trunk/drivers/net/ethernet/mellanox/mlx4/eq.c @@ -101,21 +101,15 @@ static void eq_set_ci(struct mlx4_eq *eq, int req_not) mb(); } -static struct mlx4_eqe *get_eqe(struct mlx4_eq *eq, u32 entry, u8 eqe_factor) +static struct mlx4_eqe *get_eqe(struct mlx4_eq *eq, u32 entry) { - /* (entry & (eq->nent - 1)) gives us a cyclic array */ - unsigned long offset = (entry & (eq->nent - 1)) * (MLX4_EQ_ENTRY_SIZE << eqe_factor); - /* CX3 is capable of extending the EQE from 32 to 64 bytes. - * When this feature is enabled, the first (in the lower addresses) - * 32 bytes in the 64 byte EQE are reserved and the next 32 bytes - * contain the legacy EQE information. - */ - return eq->page_list[offset / PAGE_SIZE].buf + (offset + (eqe_factor ? MLX4_EQ_ENTRY_SIZE : 0)) % PAGE_SIZE; + unsigned long off = (entry & (eq->nent - 1)) * MLX4_EQ_ENTRY_SIZE; + return eq->page_list[off / PAGE_SIZE].buf + off % PAGE_SIZE; } -static struct mlx4_eqe *next_eqe_sw(struct mlx4_eq *eq, u8 eqe_factor) +static struct mlx4_eqe *next_eqe_sw(struct mlx4_eq *eq) { - struct mlx4_eqe *eqe = get_eqe(eq, eq->cons_index, eqe_factor); + struct mlx4_eqe *eqe = get_eqe(eq, eq->cons_index); return !!(eqe->owner & 0x80) ^ !!(eq->cons_index & eq->nent) ? NULL : eqe; } @@ -183,7 +177,7 @@ static void slave_event(struct mlx4_dev *dev, u8 slave, struct mlx4_eqe *eqe) return; } - memcpy(s_eqe, eqe, dev->caps.eqe_size - 1); + memcpy(s_eqe, eqe, sizeof(struct mlx4_eqe) - 1); s_eqe->slave_id = slave; /* ensure all information is written before setting the ownersip bit */ wmb(); @@ -407,7 +401,6 @@ void mlx4_master_handle_slave_flr(struct work_struct *work) struct mlx4_slave_state *slave_state = priv->mfunc.master.slave_state; int i; int err; - unsigned long flags; mlx4_dbg(dev, "mlx4_handle_slave_flr\n"); @@ -419,10 +412,10 @@ void mlx4_master_handle_slave_flr(struct work_struct *work) mlx4_delete_all_resources_for_slave(dev, i); /*return the slave to running mode*/ - spin_lock_irqsave(&priv->mfunc.master.slave_state_lock, flags); + spin_lock(&priv->mfunc.master.slave_state_lock); slave_state[i].last_cmd = MLX4_COMM_CMD_RESET; slave_state[i].is_slave_going_down = 0; - spin_unlock_irqrestore(&priv->mfunc.master.slave_state_lock, flags); + spin_unlock(&priv->mfunc.master.slave_state_lock); /*notify the FW:*/ err = mlx4_cmd(dev, 0, i, 0, MLX4_CMD_INFORM_FLR_DONE, MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED); @@ -447,9 +440,8 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) u8 update_slave_state; int i; enum slave_port_gen_event gen_event; - unsigned long flags; - while ((eqe = next_eqe_sw(eq, dev->caps.eqe_factor))) { + while ((eqe = next_eqe_sw(eq))) { /* * Make sure we read EQ entry contents after we've * checked the ownership bit. @@ -655,13 +647,13 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) } else update_slave_state = 1; - spin_lock_irqsave(&priv->mfunc.master.slave_state_lock, flags); + spin_lock(&priv->mfunc.master.slave_state_lock); if (update_slave_state) { priv->mfunc.master.slave_state[flr_slave].active = false; priv->mfunc.master.slave_state[flr_slave].last_cmd = MLX4_COMM_CMD_FLR; priv->mfunc.master.slave_state[flr_slave].is_slave_going_down = 1; } - spin_unlock_irqrestore(&priv->mfunc.master.slave_state_lock, flags); + spin_unlock(&priv->mfunc.master.slave_state_lock); queue_work(priv->mfunc.master.comm_wq, &priv->mfunc.master.slave_flr_event_work); break; @@ -872,8 +864,7 @@ static int mlx4_create_eq(struct mlx4_dev *dev, int nent, eq->dev = dev; eq->nent = roundup_pow_of_two(max(nent, 2)); - /* CX3 is capable of extending the CQE/EQE from 32 to 64 bytes */ - npages = PAGE_ALIGN(eq->nent * (MLX4_EQ_ENTRY_SIZE << dev->caps.eqe_factor)) / PAGE_SIZE; + npages = PAGE_ALIGN(eq->nent * MLX4_EQ_ENTRY_SIZE) / PAGE_SIZE; eq->page_list = kmalloc(npages * sizeof *eq->page_list, GFP_KERNEL); @@ -975,9 +966,8 @@ static void mlx4_free_eq(struct mlx4_dev *dev, struct mlx4_priv *priv = mlx4_priv(dev); struct mlx4_cmd_mailbox *mailbox; int err; + int npages = PAGE_ALIGN(MLX4_EQ_ENTRY_SIZE * eq->nent) / PAGE_SIZE; int i; - /* CX3 is capable of extending the CQE/EQE from 32 to 64 bytes */ - int npages = PAGE_ALIGN((MLX4_EQ_ENTRY_SIZE << dev->caps.eqe_factor) * eq->nent) / PAGE_SIZE; mailbox = mlx4_alloc_cmd_mailbox(dev); if (IS_ERR(mailbox)) diff --git a/trunk/drivers/net/ethernet/mellanox/mlx4/fw.c b/trunk/drivers/net/ethernet/mellanox/mlx4/fw.c index 9a9de51ecc91..4f30b99324cf 100644 --- a/trunk/drivers/net/ethernet/mellanox/mlx4/fw.c +++ b/trunk/drivers/net/ethernet/mellanox/mlx4/fw.c @@ -110,8 +110,6 @@ static void dump_dev_cap_flags(struct mlx4_dev *dev, u64 flags) [42] = "Multicast VEP steering support", [48] = "Counters support", [59] = "Port management change event support", - [61] = "64 byte EQE support", - [62] = "64 byte CQE support", }; int i; @@ -237,7 +235,7 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave, field = dev->caps.num_ports; MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_NUM_PORTS_OFFSET); - size = dev->caps.function_caps; /* set PF behaviours */ + size = 0; /* no PF behaviour is set for now */ MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_PF_BHVR_OFFSET); field = 0; /* protected FMR support not available as yet */ @@ -1239,24 +1237,6 @@ int mlx4_INIT_HCA(struct mlx4_dev *dev, struct mlx4_init_hca_param *param) if (dev->caps.flags & MLX4_DEV_CAP_FLAG_COUNTERS) *(inbox + INIT_HCA_FLAGS_OFFSET / 4) |= cpu_to_be32(1 << 4); - /* CX3 is capable of extending CQEs/EQEs from 32 to 64 bytes */ - if (dev->caps.flags & MLX4_DEV_CAP_FLAG_64B_EQE) { - *(inbox + INIT_HCA_EQE_CQE_OFFSETS / 4) |= cpu_to_be32(1 << 29); - dev->caps.eqe_size = 64; - dev->caps.eqe_factor = 1; - } else { - dev->caps.eqe_size = 32; - dev->caps.eqe_factor = 0; - } - - if (dev->caps.flags & MLX4_DEV_CAP_FLAG_64B_CQE) { - *(inbox + INIT_HCA_EQE_CQE_OFFSETS / 4) |= cpu_to_be32(1 << 30); - dev->caps.cqe_size = 64; - dev->caps.userspace_caps |= MLX4_USER_DEV_CAP_64B_CQE; - } else { - dev->caps.cqe_size = 32; - } - /* QPC/EEC/CQC/EQC/RDMARC attributes */ MLX4_PUT(inbox, param->qpc_base, INIT_HCA_QPC_BASE_OFFSET); @@ -1339,7 +1319,6 @@ int mlx4_QUERY_HCA(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox; __be32 *outbox; int err; - u8 byte_field; #define QUERY_HCA_GLOBAL_CAPS_OFFSET 0x04 @@ -1391,13 +1370,6 @@ int mlx4_QUERY_HCA(struct mlx4_dev *dev, INIT_HCA_LOG_MC_TABLE_SZ_OFFSET); } - /* CX3 is capable of extending CQEs/EQEs from 32 to 64 bytes */ - MLX4_GET(byte_field, outbox, INIT_HCA_EQE_CQE_OFFSETS); - if (byte_field & 0x20) /* 64-bytes eqe enabled */ - param->dev_cap_enabled |= MLX4_DEV_CAP_64B_EQE_ENABLED; - if (byte_field & 0x40) /* 64-bytes cqe enabled */ - param->dev_cap_enabled |= MLX4_DEV_CAP_64B_CQE_ENABLED; - /* TPT attributes */ MLX4_GET(param->dmpt_base, outbox, INIT_HCA_DMPT_BASE_OFFSET); diff --git a/trunk/drivers/net/ethernet/mellanox/mlx4/fw.h b/trunk/drivers/net/ethernet/mellanox/mlx4/fw.h index 2c2e7ade2a34..85abe9c11a22 100644 --- a/trunk/drivers/net/ethernet/mellanox/mlx4/fw.h +++ b/trunk/drivers/net/ethernet/mellanox/mlx4/fw.h @@ -172,7 +172,6 @@ struct mlx4_init_hca_param { u8 log_uar_sz; u8 uar_page_sz; /* log pg sz in 4k chunks */ u8 fs_hash_enable_bits; - u64 dev_cap_enabled; }; struct mlx4_init_ib_param { diff --git a/trunk/drivers/net/ethernet/mellanox/mlx4/main.c b/trunk/drivers/net/ethernet/mellanox/mlx4/main.c index 4337f685175d..2aa80afd98d2 100644 --- a/trunk/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/trunk/drivers/net/ethernet/mellanox/mlx4/main.c @@ -95,14 +95,8 @@ MODULE_PARM_DESC(log_num_mgm_entry_size, "log mgm size, that defines the num" " Not in use with device managed" " flow steering"); -static bool enable_64b_cqe_eqe; -module_param(enable_64b_cqe_eqe, bool, 0444); -MODULE_PARM_DESC(enable_64b_cqe_eqe, - "Enable 64 byte CQEs/EQEs when the the FW supports this"); - #define HCA_GLOBAL_CAP_MASK 0 - -#define PF_CONTEXT_BEHAVIOUR_MASK MLX4_FUNC_CAP_64B_EQE_CQE +#define PF_CONTEXT_BEHAVIOUR_MASK 0 static char mlx4_version[] __devinitdata = DRV_NAME ": Mellanox ConnectX core driver v" @@ -392,21 +386,6 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap) dev->caps.reserved_qps_cnt[MLX4_QP_REGION_FC_EXCH]; dev->caps.sqp_demux = (mlx4_is_master(dev)) ? MLX4_MAX_NUM_SLAVES : 0; - - if (!enable_64b_cqe_eqe) { - if (dev_cap->flags & - (MLX4_DEV_CAP_FLAG_64B_CQE | MLX4_DEV_CAP_FLAG_64B_EQE)) { - mlx4_warn(dev, "64B EQEs/CQEs supported by the device but not enabled\n"); - dev->caps.flags &= ~MLX4_DEV_CAP_FLAG_64B_CQE; - dev->caps.flags &= ~MLX4_DEV_CAP_FLAG_64B_EQE; - } - } - - if ((dev_cap->flags & - (MLX4_DEV_CAP_FLAG_64B_CQE | MLX4_DEV_CAP_FLAG_64B_EQE)) && - mlx4_is_master(dev)) - dev->caps.function_caps |= MLX4_FUNC_CAP_64B_EQE_CQE; - return 0; } /*The function checks if there are live vf, return the num of them*/ @@ -620,21 +599,6 @@ static int mlx4_slave_cap(struct mlx4_dev *dev) goto err_mem; } - if (hca_param.dev_cap_enabled & MLX4_DEV_CAP_64B_EQE_ENABLED) { - dev->caps.eqe_size = 64; - dev->caps.eqe_factor = 1; - } else { - dev->caps.eqe_size = 32; - dev->caps.eqe_factor = 0; - } - - if (hca_param.dev_cap_enabled & MLX4_DEV_CAP_64B_CQE_ENABLED) { - dev->caps.cqe_size = 64; - dev->caps.userspace_caps |= MLX4_USER_DEV_CAP_64B_CQE; - } else { - dev->caps.cqe_size = 32; - } - return 0; err_mem: diff --git a/trunk/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/trunk/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index 73b5c2ac5bd5..9d27e42264e2 100644 --- a/trunk/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/trunk/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h @@ -487,7 +487,6 @@ struct mlx4_en_priv { int mac_index; unsigned max_mtu; int base_qpn; - int cqe_factor; struct mlx4_en_rss_map rss_map; __be32 ctrl_flags; diff --git a/trunk/drivers/scsi/scsi_transport_srp.c b/trunk/drivers/scsi/scsi_transport_srp.c index f379c7f3034c..21a045e0559f 100644 --- a/trunk/drivers/scsi/scsi_transport_srp.c +++ b/trunk/drivers/scsi/scsi_transport_srp.c @@ -38,7 +38,7 @@ struct srp_host_attrs { #define to_srp_host_attrs(host) ((struct srp_host_attrs *)(host)->shost_data) #define SRP_HOST_ATTRS 0 -#define SRP_RPORT_ATTRS 3 +#define SRP_RPORT_ATTRS 2 struct srp_internal { struct scsi_transport_template t; @@ -47,6 +47,7 @@ struct srp_internal { struct device_attribute *host_attrs[SRP_HOST_ATTRS + 1]; struct device_attribute *rport_attrs[SRP_RPORT_ATTRS + 1]; + struct device_attribute private_rport_attrs[SRP_RPORT_ATTRS]; struct transport_container rport_attr_cont; }; @@ -71,6 +72,24 @@ static DECLARE_TRANSPORT_CLASS(srp_host_class, "srp_host", srp_host_setup, static DECLARE_TRANSPORT_CLASS(srp_rport_class, "srp_remote_ports", NULL, NULL, NULL); +#define SETUP_TEMPLATE(attrb, field, perm, test, ro_test, ro_perm) \ + i->private_##attrb[count] = dev_attr_##field; \ + i->private_##attrb[count].attr.mode = perm; \ + if (ro_test) { \ + i->private_##attrb[count].attr.mode = ro_perm; \ + i->private_##attrb[count].store = NULL; \ + } \ + i->attrb[count] = &i->private_##attrb[count]; \ + if (test) \ + count++ + +#define SETUP_RPORT_ATTRIBUTE_RD(field) \ + SETUP_TEMPLATE(rport_attrs, field, S_IRUGO, 1, 0, 0) + +#define SETUP_RPORT_ATTRIBUTE_RW(field) \ + SETUP_TEMPLATE(rport_attrs, field, S_IRUGO | S_IWUSR, \ + 1, 1, S_IRUGO) + #define SRP_PID(p) \ (p)->port_id[0], (p)->port_id[1], (p)->port_id[2], (p)->port_id[3], \ (p)->port_id[4], (p)->port_id[5], (p)->port_id[6], (p)->port_id[7], \ @@ -116,24 +135,6 @@ show_srp_rport_roles(struct device *dev, struct device_attribute *attr, static DEVICE_ATTR(roles, S_IRUGO, show_srp_rport_roles, NULL); -static ssize_t store_srp_rport_delete(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - struct srp_rport *rport = transport_class_to_srp_rport(dev); - struct Scsi_Host *shost = dev_to_shost(dev); - struct srp_internal *i = to_srp_internal(shost->transportt); - - if (i->f->rport_delete) { - i->f->rport_delete(rport); - return count; - } else { - return -ENOSYS; - } -} - -static DEVICE_ATTR(delete, S_IWUSR, NULL, store_srp_rport_delete); - static void srp_rport_release(struct device *dev) { struct srp_rport *rport = dev_to_rport(dev); @@ -323,16 +324,12 @@ srp_attach_transport(struct srp_function_template *ft) i->rport_attr_cont.ac.attrs = &i->rport_attrs[0]; i->rport_attr_cont.ac.class = &srp_rport_class.class; i->rport_attr_cont.ac.match = srp_rport_match; + transport_container_register(&i->rport_attr_cont); count = 0; - i->rport_attrs[count++] = &dev_attr_port_id; - i->rport_attrs[count++] = &dev_attr_roles; - if (ft->rport_delete) - i->rport_attrs[count++] = &dev_attr_delete; - i->rport_attrs[count++] = NULL; - BUG_ON(count > ARRAY_SIZE(i->rport_attrs)); - - transport_container_register(&i->rport_attr_cont); + SETUP_RPORT_ATTRIBUTE_RD(port_id); + SETUP_RPORT_ATTRIBUTE_RD(roles); + i->rport_attrs[count] = NULL; i->f = ft; diff --git a/trunk/include/linux/mlx4/device.h b/trunk/include/linux/mlx4/device.h index 21821da2abfd..6d1acb04cd17 100644 --- a/trunk/include/linux/mlx4/device.h +++ b/trunk/include/linux/mlx4/device.h @@ -142,8 +142,6 @@ enum { MLX4_DEV_CAP_FLAG_COUNTERS = 1LL << 48, MLX4_DEV_CAP_FLAG_SENSE_SUPPORT = 1LL << 55, MLX4_DEV_CAP_FLAG_PORT_MNG_CHG_EV = 1LL << 59, - MLX4_DEV_CAP_FLAG_64B_EQE = 1LL << 61, - MLX4_DEV_CAP_FLAG_64B_CQE = 1LL << 62 }; enum { @@ -153,20 +151,6 @@ enum { MLX4_DEV_CAP_FLAG2_FS_EN = 1LL << 3 }; -enum { - MLX4_DEV_CAP_64B_EQE_ENABLED = 1LL << 0, - MLX4_DEV_CAP_64B_CQE_ENABLED = 1LL << 1 -}; - -enum { - MLX4_USER_DEV_CAP_64B_CQE = 1L << 0 -}; - -enum { - MLX4_FUNC_CAP_64B_EQE_CQE = 1L << 0 -}; - - #define MLX4_ATTR_EXTENDED_PORT_INFO cpu_to_be16(0xff90) enum { @@ -435,11 +419,6 @@ struct mlx4_caps { u32 max_counters; u8 port_ib_mtu[MLX4_MAX_PORTS + 1]; u16 sqp_demux; - u32 eqe_size; - u32 cqe_size; - u8 eqe_factor; - u32 userspace_caps; /* userspace must be aware of these */ - u32 function_caps; /* VFs must be aware of these */ }; struct mlx4_buf_list { diff --git a/trunk/include/rdma/Kbuild b/trunk/include/rdma/Kbuild index e69de29bb2d1..ea56f76c0c22 100644 --- a/trunk/include/rdma/Kbuild +++ b/trunk/include/rdma/Kbuild @@ -0,0 +1,6 @@ +header-y += ib_user_cm.h +header-y += ib_user_mad.h +header-y += ib_user_sa.h +header-y += ib_user_verbs.h +header-y += rdma_netlink.h +header-y += rdma_user_cm.h diff --git a/trunk/include/uapi/rdma/ib_user_cm.h b/trunk/include/rdma/ib_user_cm.h similarity index 100% rename from trunk/include/uapi/rdma/ib_user_cm.h rename to trunk/include/rdma/ib_user_cm.h diff --git a/trunk/include/uapi/rdma/ib_user_mad.h b/trunk/include/rdma/ib_user_mad.h similarity index 100% rename from trunk/include/uapi/rdma/ib_user_mad.h rename to trunk/include/rdma/ib_user_mad.h diff --git a/trunk/include/uapi/rdma/ib_user_sa.h b/trunk/include/rdma/ib_user_sa.h similarity index 100% rename from trunk/include/uapi/rdma/ib_user_sa.h rename to trunk/include/rdma/ib_user_sa.h diff --git a/trunk/include/uapi/rdma/ib_user_verbs.h b/trunk/include/rdma/ib_user_verbs.h similarity index 100% rename from trunk/include/uapi/rdma/ib_user_verbs.h rename to trunk/include/rdma/ib_user_verbs.h diff --git a/trunk/include/rdma/rdma_netlink.h b/trunk/include/rdma/rdma_netlink.h index e38de79eeb48..bd3d8b24b420 100644 --- a/trunk/include/rdma/rdma_netlink.h +++ b/trunk/include/rdma/rdma_netlink.h @@ -1,9 +1,41 @@ #ifndef _RDMA_NETLINK_H #define _RDMA_NETLINK_H +#include + +enum { + RDMA_NL_RDMA_CM = 1 +}; + +#define RDMA_NL_GET_CLIENT(type) ((type & (((1 << 6) - 1) << 10)) >> 10) +#define RDMA_NL_GET_OP(type) (type & ((1 << 10) - 1)) +#define RDMA_NL_GET_TYPE(client, op) ((client << 10) + op) + +enum { + RDMA_NL_RDMA_CM_ID_STATS = 0, + RDMA_NL_RDMA_CM_NUM_OPS +}; + +enum { + RDMA_NL_RDMA_CM_ATTR_SRC_ADDR = 1, + RDMA_NL_RDMA_CM_ATTR_DST_ADDR, + RDMA_NL_RDMA_CM_NUM_ATTR, +}; + +struct rdma_cm_id_stats { + __u32 qp_num; + __u32 bound_dev_if; + __u32 port_space; + __s32 pid; + __u8 cm_state; + __u8 node_type; + __u8 port_num; + __u8 qp_type; +}; + +#ifdef __KERNEL__ #include -#include struct ibnl_client_cbs { int (*dump)(struct sk_buff *skb, struct netlink_callback *nlcb); @@ -56,4 +88,6 @@ void *ibnl_put_msg(struct sk_buff *skb, struct nlmsghdr **nlh, int seq, int ibnl_put_attr(struct sk_buff *skb, struct nlmsghdr *nlh, int len, void *data, int type); +#endif /* __KERNEL__ */ + #endif /* _RDMA_NETLINK_H */ diff --git a/trunk/include/uapi/rdma/rdma_user_cm.h b/trunk/include/rdma/rdma_user_cm.h similarity index 100% rename from trunk/include/uapi/rdma/rdma_user_cm.h rename to trunk/include/rdma/rdma_user_cm.h diff --git a/trunk/include/scsi/scsi_transport_srp.h b/trunk/include/scsi/scsi_transport_srp.h index ff0f04ac91aa..9c60ca1c08c5 100644 --- a/trunk/include/scsi/scsi_transport_srp.h +++ b/trunk/include/scsi/scsi_transport_srp.h @@ -14,21 +14,13 @@ struct srp_rport_identifiers { }; struct srp_rport { - /* for initiator and target drivers */ - struct device dev; u8 port_id[16]; u8 roles; - - /* for initiator drivers */ - - void *lld_data; /* LLD private data */ }; struct srp_function_template { - /* for initiator drivers */ - void (*rport_delete)(struct srp_rport *rport); /* for target drivers */ int (* tsk_mgmt_response)(struct Scsi_Host *, u64, u64, int); int (* it_nexus_response)(struct Scsi_Host *, u64, int); diff --git a/trunk/include/uapi/rdma/Kbuild b/trunk/include/uapi/rdma/Kbuild index 687ae332200f..aafaa5aa54d4 100644 --- a/trunk/include/uapi/rdma/Kbuild +++ b/trunk/include/uapi/rdma/Kbuild @@ -1,7 +1 @@ # UAPI Header export list -header-y += ib_user_cm.h -header-y += ib_user_mad.h -header-y += ib_user_sa.h -header-y += ib_user_verbs.h -header-y += rdma_netlink.h -header-y += rdma_user_cm.h diff --git a/trunk/include/uapi/rdma/rdma_netlink.h b/trunk/include/uapi/rdma/rdma_netlink.h deleted file mode 100644 index 8297285b6288..000000000000 --- a/trunk/include/uapi/rdma/rdma_netlink.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _UAPI_RDMA_NETLINK_H -#define _UAPI_RDMA_NETLINK_H - -#include - -enum { - RDMA_NL_RDMA_CM = 1 -}; - -#define RDMA_NL_GET_CLIENT(type) ((type & (((1 << 6) - 1) << 10)) >> 10) -#define RDMA_NL_GET_OP(type) (type & ((1 << 10) - 1)) -#define RDMA_NL_GET_TYPE(client, op) ((client << 10) + op) - -enum { - RDMA_NL_RDMA_CM_ID_STATS = 0, - RDMA_NL_RDMA_CM_NUM_OPS -}; - -enum { - RDMA_NL_RDMA_CM_ATTR_SRC_ADDR = 1, - RDMA_NL_RDMA_CM_ATTR_DST_ADDR, - RDMA_NL_RDMA_CM_NUM_ATTR, -}; - -struct rdma_cm_id_stats { - __u32 qp_num; - __u32 bound_dev_if; - __u32 port_space; - __s32 pid; - __u8 cm_state; - __u8 node_type; - __u8 port_num; - __u8 qp_type; -}; - - -#endif /* _UAPI_RDMA_NETLINK_H */