mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
First set of updates for 4.11 kernel merge window
- Add new Broadcom bnxt_re RoCE driver - rxe driver updates - ioctl cleanups - ETH_P_IBOE declaration cleanup - IPoIB changes - Add port state cache - Allow srpt driver to accept guids as port names in config - Update to hfi1 driver - Update to srp driver - Lots of misc. minor changes all over -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJYrfewAAoJELgmozMOVy/dFnEP/2Qe7NqXRqxLS0ZqsQseFHgQ jd236E7R/XtQQTE3PTcrWL0mq0DRF6tMEjfhUASKTbZVfCBTniJAoXYrvWhN/STq LxAdigdV/0SPbxO3r9B1Xvk2v5BySaIBkaUDvcEXzT4e7UVQwZgxDkhhsYeY0Z/r 9bNB5760PzW8uO5cctXccNcWztZnW0IUZuAHVfQCPjZ7svoGwLnNDW6YQx+FsEkW tbPdzMXX8VKHlC5RcKbfOOBjdNyrUpWl+uvWEc/7mazKscp4yKVFZL7PcxqPJSfd aKdfqXYawhjZZpyws8Kn0rhkfT7xWKD/y9G5STykRJPj9/n1BDScFkmyDQhtP5bJ GANzdgH0z7Dt9LkcAs86A8EVBbIdbdT2cpPVu7t0uWEIsJw/O5ThKpgjnrrTm6m+ 89tgqLZooifTEsdj4UkZoyktrD3J9LSNZkgVmWtRn01W3oYFOPbdM4TmBZtg+/Yl VGmOJEHMEsNuJBcJcOuRJ1MVz2LebXmPUcB0RXzgmHHgulZ/DqoOtlpg5JNmJcr5 wpw/yppkBop4V4+etJBlzDsZNmZZlX+AY0ZLqQJsDHNszDjwXgAy5Rn5FYIdMyk4 ff0FKb5dzASSxHRDxAsu2uoGaREM0NkpA0UYiIZbepGLSO8PuFG2ScQ6qzU47vqu 9SEzOaaQY2S2uqFFFnYp =ugNm -----END PGP SIGNATURE----- Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma Pull rdma updates from Doug Ledford: "First set of updates for 4.11 kernel merge window - Add new Broadcom bnxt_re RoCE driver - rxe driver updates - ioctl cleanups - ETH_P_IBOE declaration cleanup - IPoIB changes - Add port state cache - Allow srpt driver to accept guids as port names in config - Update to hfi1 driver - Update to srp driver - Lots of misc minor changes all over" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma: (114 commits) RDMA/bnxt_re: fix for "bnxt_en: Update to firmware interface spec 1.7.0." rdma_cm: fail iwarp accepts w/o connection params IB/srp: Drain the send queue before destroying a QP IB/core: Add support for draining IB_POLL_DIRECT completion queues IB/srp: Improve an error path IB/srp: Make a diagnostic message more informative IB/srp: Document locking conventions IB/srp: Fix race conditions related to task management IB/srp: Avoid that duplicate responses trigger a kernel bug IB/SRP: Avoid using IB_MR_TYPE_SG_GAPS RDMA/qedr: Fix some error handling RDMA/bnxt_re: add DCB dependency IB/hns: include linux/module.h IB/vmw_pvrdma: Expose vendor error to ULPs vmw_pvrdma: switch to pci_alloc_irq_vectors IB/hfi1: use size_t for passing array length IB/ipoib: Remove redudant label IB/ipoib: remove the unnecessary memory free IB/mthca: switch to pci_alloc_irq_vectors IB/hfi1: Code reuse with memdup_copy ...
This commit is contained in:
commit
4cc4b9323f
133 changed files with 15869 additions and 2642 deletions
|
|
@ -165,4 +165,17 @@ int ib_get_cached_lmc(struct ib_device *device,
|
|||
u8 port_num,
|
||||
u8 *lmc);
|
||||
|
||||
/**
|
||||
* ib_get_cached_port_state - Returns a cached port state table entry
|
||||
* @device: The device to query.
|
||||
* @port_num: The port number of the device to query.
|
||||
* @port_state: port_state for the specified port for that device.
|
||||
*
|
||||
* ib_get_cached_port_state() fetches the specified port_state table entry stored in
|
||||
* the local software cache.
|
||||
*/
|
||||
int ib_get_cached_port_state(struct ib_device *device,
|
||||
u8 port_num,
|
||||
enum ib_port_state *port_active);
|
||||
|
||||
#endif /* _IB_CACHE_H */
|
||||
|
|
|
|||
|
|
@ -75,6 +75,12 @@
|
|||
#define IB_GRH_FLOW_SHIFT 0
|
||||
#define IB_GRH_NEXT_HDR 0x1B
|
||||
|
||||
#define IB_AETH_CREDIT_SHIFT 24
|
||||
#define IB_AETH_CREDIT_MASK 0x1F
|
||||
#define IB_AETH_CREDIT_INVAL 0x1F
|
||||
#define IB_AETH_NAK_SHIFT 29
|
||||
#define IB_MSN_MASK 0xFFFFFF
|
||||
|
||||
struct ib_reth {
|
||||
__be64 vaddr; /* potentially unaligned */
|
||||
__be32 rkey;
|
||||
|
|
|
|||
|
|
@ -153,12 +153,12 @@ struct ib_sa_path_rec {
|
|||
union ib_gid sgid;
|
||||
__be16 dlid;
|
||||
__be16 slid;
|
||||
int raw_traffic;
|
||||
u8 raw_traffic;
|
||||
/* reserved */
|
||||
__be32 flow_label;
|
||||
u8 hop_limit;
|
||||
u8 traffic_class;
|
||||
int reversible;
|
||||
u8 reversible;
|
||||
u8 numb_path;
|
||||
__be16 pkey;
|
||||
__be16 qos_class;
|
||||
|
|
@ -220,7 +220,7 @@ struct ib_sa_mcmember_rec {
|
|||
u8 hop_limit;
|
||||
u8 scope;
|
||||
u8 join_state;
|
||||
int proxy_join;
|
||||
u8 proxy_join;
|
||||
};
|
||||
|
||||
/* Service Record Component Mask Sec 15.2.5.14 Ver 1.1 */
|
||||
|
|
|
|||
|
|
@ -1789,12 +1789,17 @@ enum ib_mad_result {
|
|||
|
||||
#define IB_DEVICE_NAME_MAX 64
|
||||
|
||||
struct ib_port_cache {
|
||||
struct ib_pkey_cache *pkey;
|
||||
struct ib_gid_table *gid;
|
||||
u8 lmc;
|
||||
enum ib_port_state port_state;
|
||||
};
|
||||
|
||||
struct ib_cache {
|
||||
rwlock_t lock;
|
||||
struct ib_event_handler event_handler;
|
||||
struct ib_pkey_cache **pkey_cache;
|
||||
struct ib_gid_table **gid_cache;
|
||||
u8 *lmc_cache;
|
||||
struct ib_port_cache *ports;
|
||||
};
|
||||
|
||||
struct ib_dma_mapping_ops {
|
||||
|
|
@ -2289,6 +2294,13 @@ static inline u8 rdma_end_port(const struct ib_device *device)
|
|||
return rdma_cap_ib_switch(device) ? 0 : device->phys_port_cnt;
|
||||
}
|
||||
|
||||
static inline int rdma_is_port_valid(const struct ib_device *device,
|
||||
unsigned int port)
|
||||
{
|
||||
return (port >= rdma_start_port(device) &&
|
||||
port <= rdma_end_port(device));
|
||||
}
|
||||
|
||||
static inline bool rdma_protocol_ib(const struct ib_device *device, u8 port_num)
|
||||
{
|
||||
return device->port_immutable[port_num].core_cap_flags & RDMA_CORE_CAP_PROT_IB;
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@ struct rvt_driver_params {
|
|||
/* Protection domain */
|
||||
struct rvt_pd {
|
||||
struct ib_pd ibpd;
|
||||
int user; /* non-zero if created from user space */
|
||||
bool user;
|
||||
};
|
||||
|
||||
/* Address handle */
|
||||
|
|
@ -335,6 +335,8 @@ struct rvt_driver_provided {
|
|||
/* Notify driver a mad agent has been removed */
|
||||
void (*notify_free_mad_agent)(struct rvt_dev_info *rdi, int port_idx);
|
||||
|
||||
/* Notify driver to restart rc */
|
||||
void (*notify_restart_rc)(struct rvt_qp *qp, u32 psn, int wait);
|
||||
};
|
||||
|
||||
struct rvt_dev_info {
|
||||
|
|
@ -483,6 +485,23 @@ static inline struct rvt_qp *rvt_lookup_qpn(struct rvt_dev_info *rdi,
|
|||
return qp;
|
||||
}
|
||||
|
||||
/**
|
||||
* rvt_mod_retry_timer - mod a retry timer
|
||||
* @qp - the QP
|
||||
* Modify a potentially already running retry timer
|
||||
*/
|
||||
static inline void rvt_mod_retry_timer(struct rvt_qp *qp)
|
||||
{
|
||||
struct ib_qp *ibqp = &qp->ibqp;
|
||||
struct rvt_dev_info *rdi = ib_to_rvt(ibqp->device);
|
||||
|
||||
lockdep_assert_held(&qp->s_lock);
|
||||
qp->s_flags |= RVT_S_TIMER;
|
||||
/* 4.096 usec. * (1 << qp->timeout) */
|
||||
mod_timer(&qp->s_timer, jiffies + qp->timeout_jiffies +
|
||||
rdi->busy_jiffies);
|
||||
}
|
||||
|
||||
struct rvt_dev_info *rvt_alloc_device(size_t size, int nports);
|
||||
void rvt_dealloc_device(struct rvt_dev_info *rdi);
|
||||
int rvt_register_device(struct rvt_dev_info *rvd);
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@
|
|||
* For Memory Regions. This stuff should probably be moved into rdmavt/mr.h once
|
||||
* drivers no longer need access to the MR directly.
|
||||
*/
|
||||
#include <linux/percpu-refcount.h>
|
||||
|
||||
/*
|
||||
* A segment is a linear region of low physical memory.
|
||||
|
|
@ -79,11 +80,11 @@ struct rvt_mregion {
|
|||
int access_flags;
|
||||
u32 max_segs; /* number of rvt_segs in all the arrays */
|
||||
u32 mapsz; /* size of the map array */
|
||||
atomic_t lkey_invalid; /* true if current lkey is invalid */
|
||||
u8 page_shift; /* 0 - non unform/non powerof2 sizes */
|
||||
u8 lkey_published; /* in global table */
|
||||
atomic_t lkey_invalid; /* true if current lkey is invalid */
|
||||
struct percpu_ref refcount;
|
||||
struct completion comp; /* complete when refcount goes to zero */
|
||||
atomic_t refcount;
|
||||
struct rvt_segarray *map[0]; /* the segments */
|
||||
};
|
||||
|
||||
|
|
@ -123,13 +124,12 @@ struct rvt_sge_state {
|
|||
|
||||
static inline void rvt_put_mr(struct rvt_mregion *mr)
|
||||
{
|
||||
if (unlikely(atomic_dec_and_test(&mr->refcount)))
|
||||
complete(&mr->comp);
|
||||
percpu_ref_put(&mr->refcount);
|
||||
}
|
||||
|
||||
static inline void rvt_get_mr(struct rvt_mregion *mr)
|
||||
{
|
||||
atomic_inc(&mr->refcount);
|
||||
percpu_ref_get(&mr->refcount);
|
||||
}
|
||||
|
||||
static inline void rvt_put_ss(struct rvt_sge_state *ss)
|
||||
|
|
@ -141,4 +141,54 @@ static inline void rvt_put_ss(struct rvt_sge_state *ss)
|
|||
}
|
||||
}
|
||||
|
||||
static inline u32 rvt_get_sge_length(struct rvt_sge *sge, u32 length)
|
||||
{
|
||||
u32 len = sge->length;
|
||||
|
||||
if (len > length)
|
||||
len = length;
|
||||
if (len > sge->sge_length)
|
||||
len = sge->sge_length;
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static inline void rvt_update_sge(struct rvt_sge_state *ss, u32 length,
|
||||
bool release)
|
||||
{
|
||||
struct rvt_sge *sge = &ss->sge;
|
||||
|
||||
sge->vaddr += length;
|
||||
sge->length -= length;
|
||||
sge->sge_length -= length;
|
||||
if (sge->sge_length == 0) {
|
||||
if (release)
|
||||
rvt_put_mr(sge->mr);
|
||||
if (--ss->num_sge)
|
||||
*sge = *ss->sg_list++;
|
||||
} else if (sge->length == 0 && sge->mr->lkey) {
|
||||
if (++sge->n >= RVT_SEGSZ) {
|
||||
if (++sge->m >= sge->mr->mapsz)
|
||||
return;
|
||||
sge->n = 0;
|
||||
}
|
||||
sge->vaddr = sge->mr->map[sge->m]->segs[sge->n].vaddr;
|
||||
sge->length = sge->mr->map[sge->m]->segs[sge->n].length;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void rvt_skip_sge(struct rvt_sge_state *ss, u32 length,
|
||||
bool release)
|
||||
{
|
||||
struct rvt_sge *sge = &ss->sge;
|
||||
|
||||
while (length) {
|
||||
u32 len = rvt_get_sge_length(sge, length);
|
||||
|
||||
WARN_ON_ONCE(len == 0);
|
||||
rvt_update_sge(ss, len, release);
|
||||
length -= len;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* DEF_RDMAVT_INCMRH */
|
||||
|
|
|
|||
|
|
@ -144,6 +144,8 @@
|
|||
#define RVT_FLUSH_RECV 0x40
|
||||
#define RVT_PROCESS_OR_FLUSH_SEND \
|
||||
(RVT_PROCESS_SEND_OK | RVT_FLUSH_SEND)
|
||||
#define RVT_SEND_OR_FLUSH_OR_RECV_OK \
|
||||
(RVT_PROCESS_SEND_OK | RVT_FLUSH_SEND | RVT_PROCESS_RECV_OK)
|
||||
|
||||
/*
|
||||
* Internal send flags
|
||||
|
|
@ -370,6 +372,7 @@ struct rvt_qp {
|
|||
|
||||
struct rvt_sge_state s_ack_rdma_sge;
|
||||
struct timer_list s_timer;
|
||||
struct hrtimer s_rnr_timer;
|
||||
|
||||
atomic_t local_ops_pending; /* number of fast_reg/local_inv reqs */
|
||||
|
||||
|
|
@ -466,6 +469,15 @@ static inline struct rvt_rwqe *rvt_get_rwqe_ptr(struct rvt_rq *rq, unsigned n)
|
|||
rq->max_sge * sizeof(struct ib_sge)) * n);
|
||||
}
|
||||
|
||||
/**
|
||||
* rvt_is_user_qp - return if this is user mode QP
|
||||
* @qp - the target QP
|
||||
*/
|
||||
static inline bool rvt_is_user_qp(struct rvt_qp *qp)
|
||||
{
|
||||
return !!qp->pid;
|
||||
}
|
||||
|
||||
/**
|
||||
* rvt_get_qp - get a QP reference
|
||||
* @qp - the QP to hold
|
||||
|
|
@ -582,6 +594,32 @@ static inline void rvt_qp_swqe_complete(
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Compare the lower 24 bits of the msn values.
|
||||
* Returns an integer <, ==, or > than zero.
|
||||
*/
|
||||
static inline int rvt_cmp_msn(u32 a, u32 b)
|
||||
{
|
||||
return (((int)a) - ((int)b)) << 8;
|
||||
}
|
||||
|
||||
/**
|
||||
* rvt_compute_aeth - compute the AETH (syndrome + MSN)
|
||||
* @qp: the queue pair to compute the AETH for
|
||||
*
|
||||
* Returns the AETH.
|
||||
*/
|
||||
__be32 rvt_compute_aeth(struct rvt_qp *qp);
|
||||
|
||||
/**
|
||||
* rvt_get_credit - flush the send work queue of a QP
|
||||
* @qp: the qp who's send work queue to flush
|
||||
* @aeth: the Acknowledge Extended Transport Header
|
||||
*
|
||||
* The QP s_lock should be held.
|
||||
*/
|
||||
void rvt_get_credit(struct rvt_qp *qp, u32 aeth);
|
||||
|
||||
/**
|
||||
* @qp - the qp pair
|
||||
* @len - the length
|
||||
|
|
@ -607,6 +645,14 @@ static inline u32 rvt_div_mtu(struct rvt_qp *qp, u32 len)
|
|||
extern const int ib_rvt_state_ops[];
|
||||
|
||||
struct rvt_dev_info;
|
||||
void rvt_comm_est(struct rvt_qp *qp);
|
||||
int rvt_error_qp(struct rvt_qp *qp, enum ib_wc_status err);
|
||||
void rvt_rc_error(struct rvt_qp *qp, enum ib_wc_status err);
|
||||
unsigned long rvt_rnr_tbl_to_usec(u32 index);
|
||||
enum hrtimer_restart rvt_rc_rnr_retry(struct hrtimer *t);
|
||||
void rvt_add_rnr_timer(struct rvt_qp *qp, u32 aeth);
|
||||
void rvt_del_timers_sync(struct rvt_qp *qp);
|
||||
void rvt_stop_rc_timers(struct rvt_qp *qp);
|
||||
void rvt_add_retry_timer(struct rvt_qp *qp);
|
||||
|
||||
#endif /* DEF_RDMAVT_INCQP_H */
|
||||
|
|
|
|||
Loading…
Reference in a new issue