Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
X
xcap-capability-linux
Project overview
Project overview
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
xcap
xcap-capability-linux
Commits
94d7f1a2
Commit
94d7f1a2
authored
May 05, 2016
by
Doug Ledford
Browse files
Options
Browse Files
Download
Plain Diff
Merge branches 'hfi1' and 'iw_cxgb4' into k.o/for-4.7
parents
ccea5f0f
d35cf744
69736279
Changes
40
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
40 changed files
with
1138 additions
and
546 deletions
+1138
-546
drivers/infiniband/hw/cxgb4/cm.c
drivers/infiniband/hw/cxgb4/cm.c
+175
-77
drivers/infiniband/hw/nes/nes_nic.c
drivers/infiniband/hw/nes/nes_nic.c
+0
-3
drivers/infiniband/hw/qib/qib_init.c
drivers/infiniband/hw/qib/qib_init.c
+2
-2
drivers/infiniband/hw/qib/qib_rc.c
drivers/infiniband/hw/qib/qib_rc.c
+1
-1
drivers/infiniband/hw/qib/qib_ruc.c
drivers/infiniband/hw/qib/qib_ruc.c
+2
-2
drivers/infiniband/hw/qib/qib_uc.c
drivers/infiniband/hw/qib/qib_uc.c
+1
-1
drivers/infiniband/hw/qib/qib_ud.c
drivers/infiniband/hw/qib/qib_ud.c
+5
-5
drivers/infiniband/hw/qib/qib_verbs.h
drivers/infiniband/hw/qib/qib_verbs.h
+3
-3
drivers/infiniband/sw/rdmavt/qp.c
drivers/infiniband/sw/rdmavt/qp.c
+3
-3
drivers/infiniband/sw/rdmavt/vt.c
drivers/infiniband/sw/rdmavt/vt.c
+13
-0
drivers/infiniband/ulp/iser/iscsi_iser.c
drivers/infiniband/ulp/iser/iscsi_iser.c
+10
-4
drivers/staging/rdma/hfi1/affinity.c
drivers/staging/rdma/hfi1/affinity.c
+47
-46
drivers/staging/rdma/hfi1/affinity.h
drivers/staging/rdma/hfi1/affinity.h
+18
-1
drivers/staging/rdma/hfi1/chip.c
drivers/staging/rdma/hfi1/chip.c
+461
-186
drivers/staging/rdma/hfi1/chip.h
drivers/staging/rdma/hfi1/chip.h
+6
-1
drivers/staging/rdma/hfi1/chip_registers.h
drivers/staging/rdma/hfi1/chip_registers.h
+1
-0
drivers/staging/rdma/hfi1/diag.c
drivers/staging/rdma/hfi1/diag.c
+2
-1
drivers/staging/rdma/hfi1/driver.c
drivers/staging/rdma/hfi1/driver.c
+2
-1
drivers/staging/rdma/hfi1/firmware.c
drivers/staging/rdma/hfi1/firmware.c
+8
-1
drivers/staging/rdma/hfi1/hfi.h
drivers/staging/rdma/hfi1/hfi.h
+7
-4
drivers/staging/rdma/hfi1/init.c
drivers/staging/rdma/hfi1/init.c
+11
-14
drivers/staging/rdma/hfi1/mad.c
drivers/staging/rdma/hfi1/mad.c
+15
-1
drivers/staging/rdma/hfi1/mmu_rb.c
drivers/staging/rdma/hfi1/mmu_rb.c
+29
-6
drivers/staging/rdma/hfi1/mmu_rb.h
drivers/staging/rdma/hfi1/mmu_rb.h
+2
-0
drivers/staging/rdma/hfi1/pio.c
drivers/staging/rdma/hfi1/pio.c
+41
-11
drivers/staging/rdma/hfi1/pio.h
drivers/staging/rdma/hfi1/pio.h
+3
-1
drivers/staging/rdma/hfi1/platform.c
drivers/staging/rdma/hfi1/platform.c
+54
-45
drivers/staging/rdma/hfi1/qp.c
drivers/staging/rdma/hfi1/qp.c
+5
-1
drivers/staging/rdma/hfi1/qsfp.c
drivers/staging/rdma/hfi1/qsfp.c
+42
-16
drivers/staging/rdma/hfi1/qsfp.h
drivers/staging/rdma/hfi1/qsfp.h
+7
-8
drivers/staging/rdma/hfi1/rc.c
drivers/staging/rdma/hfi1/rc.c
+4
-5
drivers/staging/rdma/hfi1/ruc.c
drivers/staging/rdma/hfi1/ruc.c
+11
-9
drivers/staging/rdma/hfi1/sysfs.c
drivers/staging/rdma/hfi1/sysfs.c
+2
-2
drivers/staging/rdma/hfi1/ud.c
drivers/staging/rdma/hfi1/ud.c
+4
-4
drivers/staging/rdma/hfi1/user_exp_rcv.c
drivers/staging/rdma/hfi1/user_exp_rcv.c
+5
-2
drivers/staging/rdma/hfi1/user_sdma.c
drivers/staging/rdma/hfi1/user_sdma.c
+65
-32
drivers/staging/rdma/hfi1/verbs.c
drivers/staging/rdma/hfi1/verbs.c
+66
-42
drivers/staging/rdma/hfi1/verbs.h
drivers/staging/rdma/hfi1/verbs.h
+1
-3
include/rdma/rdma_vt.h
include/rdma/rdma_vt.h
+1
-0
include/rdma/rdmavt_qp.h
include/rdma/rdmavt_qp.h
+3
-2
No files found.
drivers/infiniband/hw/cxgb4/cm.c
View file @
94d7f1a2
This diff is collapsed.
Click to expand it.
drivers/infiniband/hw/nes/nes_nic.c
View file @
94d7f1a2
...
...
@@ -500,9 +500,6 @@ static int nes_netdev_start_xmit(struct sk_buff *skb, struct net_device *netdev)
* skb_shinfo(skb)->nr_frags, skb_is_gso(skb));
*/
if
(
!
netif_carrier_ok
(
netdev
))
return
NETDEV_TX_OK
;
if
(
netif_queue_stopped
(
netdev
))
return
NETDEV_TX_BUSY
;
...
...
drivers/infiniband/hw/qib/qib_init.c
View file @
94d7f1a2
...
...
@@ -1090,7 +1090,7 @@ void qib_free_devdata(struct qib_devdata *dd)
qib_dbg_ibdev_exit
(
&
dd
->
verbs_dev
);
#endif
free_percpu
(
dd
->
int_counter
);
ib_dealloc_device
(
&
dd
->
verbs_dev
.
rdi
.
ibdev
);
rvt_dealloc_device
(
&
dd
->
verbs_dev
.
rdi
);
}
u64
qib_int_counter
(
struct
qib_devdata
*
dd
)
...
...
@@ -1183,7 +1183,7 @@ struct qib_devdata *qib_alloc_devdata(struct pci_dev *pdev, size_t extra)
bail:
if
(
!
list_empty
(
&
dd
->
list
))
list_del_init
(
&
dd
->
list
);
ib_dealloc_device
(
&
dd
->
verbs_dev
.
rdi
.
ibdev
);
rvt_dealloc_device
(
&
dd
->
verbs_dev
.
rdi
);
return
ERR_PTR
(
ret
);
}
...
...
drivers/infiniband/hw/qib/qib_rc.c
View file @
94d7f1a2
...
...
@@ -230,7 +230,7 @@ bail:
*
* Return 1 if constructed; otherwise, return 0.
*/
int
qib_make_rc_req
(
struct
rvt_qp
*
qp
)
int
qib_make_rc_req
(
struct
rvt_qp
*
qp
,
unsigned
long
*
flags
)
{
struct
qib_qp_priv
*
priv
=
qp
->
priv
;
struct
qib_ibdev
*
dev
=
to_idev
(
qp
->
ibqp
.
device
);
...
...
drivers/infiniband/hw/qib/qib_ruc.c
View file @
94d7f1a2
...
...
@@ -739,7 +739,7 @@ void qib_do_send(struct rvt_qp *qp)
struct
qib_qp_priv
*
priv
=
qp
->
priv
;
struct
qib_ibport
*
ibp
=
to_iport
(
qp
->
ibqp
.
device
,
qp
->
port_num
);
struct
qib_pportdata
*
ppd
=
ppd_from_ibp
(
ibp
);
int
(
*
make_req
)(
struct
rvt_qp
*
qp
);
int
(
*
make_req
)(
struct
rvt_qp
*
qp
,
unsigned
long
*
flags
);
unsigned
long
flags
;
if
((
qp
->
ibqp
.
qp_type
==
IB_QPT_RC
||
...
...
@@ -781,7 +781,7 @@ void qib_do_send(struct rvt_qp *qp)
qp
->
s_hdrwords
=
0
;
spin_lock_irqsave
(
&
qp
->
s_lock
,
flags
);
}
}
while
(
make_req
(
qp
));
}
while
(
make_req
(
qp
,
&
flags
));
spin_unlock_irqrestore
(
&
qp
->
s_lock
,
flags
);
}
...
...
drivers/infiniband/hw/qib/qib_uc.c
View file @
94d7f1a2
...
...
@@ -45,7 +45,7 @@
*
* Return 1 if constructed; otherwise, return 0.
*/
int
qib_make_uc_req
(
struct
rvt_qp
*
qp
)
int
qib_make_uc_req
(
struct
rvt_qp
*
qp
,
unsigned
long
*
flags
)
{
struct
qib_qp_priv
*
priv
=
qp
->
priv
;
struct
qib_other_headers
*
ohdr
;
...
...
drivers/infiniband/hw/qib/qib_ud.c
View file @
94d7f1a2
...
...
@@ -238,7 +238,7 @@ drop:
*
* Return 1 if constructed; otherwise, return 0.
*/
int
qib_make_ud_req
(
struct
rvt_qp
*
qp
)
int
qib_make_ud_req
(
struct
rvt_qp
*
qp
,
unsigned
long
*
flags
)
{
struct
qib_qp_priv
*
priv
=
qp
->
priv
;
struct
qib_other_headers
*
ohdr
;
...
...
@@ -294,7 +294,7 @@ int qib_make_ud_req(struct rvt_qp *qp)
this_cpu_inc
(
ibp
->
pmastats
->
n_unicast_xmit
);
lid
=
ah_attr
->
dlid
&
~
((
1
<<
ppd
->
lmc
)
-
1
);
if
(
unlikely
(
lid
==
ppd
->
lid
))
{
unsigned
long
flags
;
unsigned
long
tflags
=
*
flags
;
/*
* If DMAs are in progress, we can't generate
* a completion for the loopback packet since
...
...
@@ -307,10 +307,10 @@ int qib_make_ud_req(struct rvt_qp *qp)
goto
bail
;
}
qp
->
s_cur
=
next_cur
;
local_irq_save
(
flags
);
spin_unlock_irqrestore
(
&
qp
->
s_lock
,
flags
);
spin_unlock_irqrestore
(
&
qp
->
s_lock
,
tflags
);
qib_ud_loopback
(
qp
,
wqe
);
spin_lock_irqsave
(
&
qp
->
s_lock
,
flags
);
spin_lock_irqsave
(
&
qp
->
s_lock
,
tflags
);
*
flags
=
tflags
;
qib_send_complete
(
qp
,
wqe
,
IB_WC_SUCCESS
);
goto
done
;
}
...
...
drivers/infiniband/hw/qib/qib_verbs.h
View file @
94d7f1a2
...
...
@@ -430,11 +430,11 @@ void qib_send_complete(struct rvt_qp *qp, struct rvt_swqe *wqe,
void
qib_send_rc_ack
(
struct
rvt_qp
*
qp
);
int
qib_make_rc_req
(
struct
rvt_qp
*
qp
);
int
qib_make_rc_req
(
struct
rvt_qp
*
qp
,
unsigned
long
*
flags
);
int
qib_make_uc_req
(
struct
rvt_qp
*
qp
);
int
qib_make_uc_req
(
struct
rvt_qp
*
qp
,
unsigned
long
*
flags
);
int
qib_make_ud_req
(
struct
rvt_qp
*
qp
);
int
qib_make_ud_req
(
struct
rvt_qp
*
qp
,
unsigned
long
*
flags
);
int
qib_register_ib_device
(
struct
qib_devdata
*
);
...
...
drivers/infiniband/sw/rdmavt/qp.c
View file @
94d7f1a2
...
...
@@ -829,13 +829,13 @@ struct ib_qp *rvt_create_qp(struct ib_pd *ibpd,
case
IB_QPT_SMI
:
case
IB_QPT_GSI
:
case
IB_QPT_UD
:
qp
->
allowed_ops
=
IB_OPCODE_UD
_SEND_ONLY
&
RVT_OPCODE_QP_MASK
;
qp
->
allowed_ops
=
IB_OPCODE_UD
;
break
;
case
IB_QPT_RC
:
qp
->
allowed_ops
=
IB_OPCODE_RC
_SEND_ONLY
&
RVT_OPCODE_QP_MASK
;
qp
->
allowed_ops
=
IB_OPCODE_RC
;
break
;
case
IB_QPT_UC
:
qp
->
allowed_ops
=
IB_OPCODE_UC
_SEND_ONLY
&
RVT_OPCODE_QP_MASK
;
qp
->
allowed_ops
=
IB_OPCODE_UC
;
break
;
default:
ret
=
ERR_PTR
(
-
EINVAL
);
...
...
drivers/infiniband/sw/rdmavt/vt.c
View file @
94d7f1a2
...
...
@@ -106,6 +106,19 @@ struct rvt_dev_info *rvt_alloc_device(size_t size, int nports)
}
EXPORT_SYMBOL
(
rvt_alloc_device
);
/**
* rvt_dealloc_device - deallocate rdi
* @rdi: structure to free
*
* Free a structure allocated with rvt_alloc_device()
*/
void
rvt_dealloc_device
(
struct
rvt_dev_info
*
rdi
)
{
kfree
(
rdi
->
ports
);
ib_dealloc_device
(
&
rdi
->
ibdev
);
}
EXPORT_SYMBOL
(
rvt_dealloc_device
);
static
int
rvt_query_device
(
struct
ib_device
*
ibdev
,
struct
ib_device_attr
*
props
,
struct
ib_udata
*
uhw
)
...
...
drivers/infiniband/ulp/iser/iscsi_iser.c
View file @
94d7f1a2
...
...
@@ -612,6 +612,7 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
struct
Scsi_Host
*
shost
;
struct
iser_conn
*
iser_conn
=
NULL
;
struct
ib_conn
*
ib_conn
;
u32
max_fr_sectors
;
u16
max_cmds
;
shost
=
iscsi_host_alloc
(
&
iscsi_iser_sht
,
0
,
0
);
...
...
@@ -632,7 +633,6 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
iser_conn
=
ep
->
dd_data
;
max_cmds
=
iser_conn
->
max_cmds
;
shost
->
sg_tablesize
=
iser_conn
->
scsi_sg_tablesize
;
shost
->
max_sectors
=
iser_conn
->
scsi_max_sectors
;
mutex_lock
(
&
iser_conn
->
state_mutex
);
if
(
iser_conn
->
state
!=
ISER_CONN_UP
)
{
...
...
@@ -657,8 +657,6 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
*/
shost
->
sg_tablesize
=
min_t
(
unsigned
short
,
shost
->
sg_tablesize
,
ib_conn
->
device
->
ib_device
->
attrs
.
max_fast_reg_page_list_len
);
shost
->
max_sectors
=
min_t
(
unsigned
int
,
1024
,
(
shost
->
sg_tablesize
*
PAGE_SIZE
)
>>
9
);
if
(
iscsi_host_add
(
shost
,
ib_conn
->
device
->
ib_device
->
dma_device
))
{
...
...
@@ -672,6 +670,15 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
goto
free_host
;
}
/*
* FRs or FMRs can only map up to a (device) page per entry, but if the
* first entry is misaligned we'll end up using using two entries
* (head and tail) for a single page worth data, so we have to drop
* one segment from the calculation.
*/
max_fr_sectors
=
((
shost
->
sg_tablesize
-
1
)
*
PAGE_SIZE
)
>>
9
;
shost
->
max_sectors
=
min
(
iser_max_sectors
,
max_fr_sectors
);
if
(
cmds_max
>
max_cmds
)
{
iser_info
(
"cmds_max changed from %u to %u
\n
"
,
cmds_max
,
max_cmds
);
...
...
@@ -989,7 +996,6 @@ static struct scsi_host_template iscsi_iser_sht = {
.
queuecommand
=
iscsi_queuecommand
,
.
change_queue_depth
=
scsi_change_queue_depth
,
.
sg_tablesize
=
ISCSI_ISER_DEF_SG_TABLESIZE
,
.
max_sectors
=
ISER_DEF_MAX_SECTORS
,
.
cmd_per_lun
=
ISER_DEF_CMD_PER_LUN
,
.
eh_abort_handler
=
iscsi_eh_abort
,
.
eh_device_reset_handler
=
iscsi_eh_device_reset
,
...
...
drivers/staging/rdma/hfi1/affinity.c
View file @
94d7f1a2
...
...
@@ -53,20 +53,6 @@
#include "sdma.h"
#include "trace.h"
struct
cpu_mask_set
{
struct
cpumask
mask
;
struct
cpumask
used
;
uint
gen
;
};
struct
hfi1_affinity
{
struct
cpu_mask_set
def_intr
;
struct
cpu_mask_set
rcv_intr
;
struct
cpu_mask_set
proc
;
/* spin lock to protect affinity struct */
spinlock_t
lock
;
};
/* Name of IRQ types, indexed by enum irq_type */
static
const
char
*
const
irq_type_names
[]
=
{
"SDMA"
,
...
...
@@ -82,6 +68,48 @@ static inline void init_cpu_mask_set(struct cpu_mask_set *set)
set
->
gen
=
0
;
}
/* Initialize non-HT cpu cores mask */
int
init_real_cpu_mask
(
struct
hfi1_devdata
*
dd
)
{
struct
hfi1_affinity
*
info
;
int
possible
,
curr_cpu
,
i
,
ht
;
info
=
kzalloc
(
sizeof
(
*
info
),
GFP_KERNEL
);
if
(
!
info
)
return
-
ENOMEM
;
cpumask_clear
(
&
info
->
real_cpu_mask
);
/* Start with cpu online mask as the real cpu mask */
cpumask_copy
(
&
info
->
real_cpu_mask
,
cpu_online_mask
);
/*
* Remove HT cores from the real cpu mask. Do this in two steps below.
*/
possible
=
cpumask_weight
(
&
info
->
real_cpu_mask
);
ht
=
cpumask_weight
(
topology_sibling_cpumask
(
cpumask_first
(
&
info
->
real_cpu_mask
)));
/*
* Step 1. Skip over the first N HT siblings and use them as the
* "real" cores. Assumes that HT cores are not enumerated in
* succession (except in the single core case).
*/
curr_cpu
=
cpumask_first
(
&
info
->
real_cpu_mask
);
for
(
i
=
0
;
i
<
possible
/
ht
;
i
++
)
curr_cpu
=
cpumask_next
(
curr_cpu
,
&
info
->
real_cpu_mask
);
/*
* Step 2. Remove the remaining HT siblings. Use cpumask_next() to
* skip any gaps.
*/
for
(;
i
<
possible
;
i
++
)
{
cpumask_clear_cpu
(
curr_cpu
,
&
info
->
real_cpu_mask
);
curr_cpu
=
cpumask_next
(
curr_cpu
,
&
info
->
real_cpu_mask
);
}
dd
->
affinity
=
info
;
return
0
;
}
/*
* Interrupt affinity.
*
...
...
@@ -93,20 +121,17 @@ static inline void init_cpu_mask_set(struct cpu_mask_set *set)
* to the node relative 1 as necessary.
*
*/
int
hfi1_dev_affinity_init
(
struct
hfi1_devdata
*
dd
)
void
hfi1_dev_affinity_init
(
struct
hfi1_devdata
*
dd
)
{
int
node
=
pcibus_to_node
(
dd
->
pcidev
->
bus
);
struct
hfi1_affinity
*
info
;
struct
hfi1_affinity
*
info
=
dd
->
affinity
;
const
struct
cpumask
*
local_mask
;
int
curr_cpu
,
possible
,
i
,
ht
;
int
curr_cpu
,
possible
,
i
;
if
(
node
<
0
)
node
=
numa_node_id
();
dd
->
node
=
node
;
info
=
kzalloc
(
sizeof
(
*
info
),
GFP_KERNEL
);
if
(
!
info
)
return
-
ENOMEM
;
spin_lock_init
(
&
info
->
lock
);
init_cpu_mask_set
(
&
info
->
def_intr
);
...
...
@@ -116,30 +141,8 @@ int hfi1_dev_affinity_init(struct hfi1_devdata *dd)
local_mask
=
cpumask_of_node
(
dd
->
node
);
if
(
cpumask_first
(
local_mask
)
>=
nr_cpu_ids
)
local_mask
=
topology_core_cpumask
(
0
);
/* use local mask as default */
cpumask_copy
(
&
info
->
def_intr
.
mask
,
local_mask
);
/*
* Remove HT cores from the default mask. Do this in two steps below.
*/
possible
=
cpumask_weight
(
&
info
->
def_intr
.
mask
);
ht
=
cpumask_weight
(
topology_sibling_cpumask
(
cpumask_first
(
&
info
->
def_intr
.
mask
)));
/*
* Step 1. Skip over the first N HT siblings and use them as the
* "real" cores. Assumes that HT cores are not enumerated in
* succession (except in the single core case).
*/
curr_cpu
=
cpumask_first
(
&
info
->
def_intr
.
mask
);
for
(
i
=
0
;
i
<
possible
/
ht
;
i
++
)
curr_cpu
=
cpumask_next
(
curr_cpu
,
&
info
->
def_intr
.
mask
);
/*
* Step 2. Remove the remaining HT siblings. Use cpumask_next() to
* skip any gaps.
*/
for
(;
i
<
possible
;
i
++
)
{
cpumask_clear_cpu
(
curr_cpu
,
&
info
->
def_intr
.
mask
);
curr_cpu
=
cpumask_next
(
curr_cpu
,
&
info
->
def_intr
.
mask
);
}
/* Use the "real" cpu mask of this node as the default */
cpumask_and
(
&
info
->
def_intr
.
mask
,
&
info
->
real_cpu_mask
,
local_mask
);
/* fill in the receive list */
possible
=
cpumask_weight
(
&
info
->
def_intr
.
mask
);
...
...
@@ -167,8 +170,6 @@ int hfi1_dev_affinity_init(struct hfi1_devdata *dd)
}
cpumask_copy
(
&
info
->
proc
.
mask
,
cpu_online_mask
);
dd
->
affinity
=
info
;
return
0
;
}
void
hfi1_dev_affinity_free
(
struct
hfi1_devdata
*
dd
)
...
...
drivers/staging/rdma/hfi1/affinity.h
View file @
94d7f1a2
...
...
@@ -64,10 +64,27 @@ enum affinity_flags {
AFF_IRQ_LOCAL
};
struct
cpu_mask_set
{
struct
cpumask
mask
;
struct
cpumask
used
;
uint
gen
;
};
struct
hfi1_affinity
{
struct
cpu_mask_set
def_intr
;
struct
cpu_mask_set
rcv_intr
;
struct
cpu_mask_set
proc
;
struct
cpumask
real_cpu_mask
;
/* spin lock to protect affinity struct */
spinlock_t
lock
;
};
struct
hfi1_msix_entry
;
/* Initialize non-HT cpu cores mask */
int
init_real_cpu_mask
(
struct
hfi1_devdata
*
);
/* Initialize driver affinity data */
int
hfi1_dev_affinity_init
(
struct
hfi1_devdata
*
);
void
hfi1_dev_affinity_init
(
struct
hfi1_devdata
*
);
/* Free driver affinity data */
void
hfi1_dev_affinity_free
(
struct
hfi1_devdata
*
);
/*
...
...
drivers/staging/rdma/hfi1/chip.c
View file @
94d7f1a2
This diff is collapsed.
Click to expand it.
drivers/staging/rdma/hfi1/chip.h
View file @
94d7f1a2
...
...
@@ -389,6 +389,7 @@
#define LAST_REMOTE_STATE_COMPLETE 0x13
#define LINK_QUALITY_INFO 0x14
#define REMOTE_DEVICE_ID 0x15
#define LINK_DOWN_REASON 0x16
/* 8051 lane specific register field IDs */
#define TX_EQ_SETTINGS 0x00
...
...
@@ -497,6 +498,11 @@
#define PWRM_BER_CONTROL 0x1
#define PWRM_BANDWIDTH_CONTROL 0x2
/* 8051 link down reasons */
#define LDR_LINK_TRANSFER_ACTIVE_LOW 0xa
#define LDR_RECEIVED_LINKDOWN_IDLE_MSG 0xb
#define LDR_RECEIVED_HOST_OFFLINE_REQ 0xc
/* verify capability fabric CRC size bits */
enum
{
CAP_CRC_14B
=
(
1
<<
0
),
/* 14b CRC */
...
...
@@ -691,7 +697,6 @@ void handle_verify_cap(struct work_struct *work);
void
handle_freeze
(
struct
work_struct
*
work
);
void
handle_link_up
(
struct
work_struct
*
work
);
void
handle_link_down
(
struct
work_struct
*
work
);
void
handle_8051_request
(
struct
work_struct
*
work
);
void
handle_link_downgrade
(
struct
work_struct
*
work
);
void
handle_link_bounce
(
struct
work_struct
*
work
);
void
handle_sma_message
(
struct
work_struct
*
work
);
...
...
drivers/staging/rdma/hfi1/chip_registers.h
View file @
94d7f1a2
...
...
@@ -771,6 +771,7 @@
#define RCV_RSM_CFG_ENABLE_OR_CHAIN_RSM0_MASK 0x1ull
#define RCV_RSM_CFG_ENABLE_OR_CHAIN_RSM0_SHIFT 0
#define RCV_RSM_CFG_PACKET_TYPE_SHIFT 60
#define RCV_RSM_CFG_OFFSET_SHIFT 32
#define RCV_RSM_MAP_TABLE (RXE + 0x000000000900)
#define RCV_RSM_MAP_TABLE_RCV_CONTEXT_A_MASK 0xFFull
#define RCV_RSM_MATCH (RXE + 0x000000000800)
...
...
drivers/staging/rdma/hfi1/diag.c
View file @
94d7f1a2
...
...
@@ -413,7 +413,8 @@ static ssize_t diagpkt_send(struct diag_pkt *dp)
goto
bail
;
}
/* can only use kernel contexts */
if
(
dd
->
send_contexts
[
dp
->
sw_index
].
type
!=
SC_KERNEL
)
{
if
(
dd
->
send_contexts
[
dp
->
sw_index
].
type
!=
SC_KERNEL
&&
dd
->
send_contexts
[
dp
->
sw_index
].
type
!=
SC_VL15
)
{
ret
=
-
EINVAL
;
goto
bail
;
}
...
...
drivers/staging/rdma/hfi1/driver.c
View file @
94d7f1a2
...
...
@@ -75,7 +75,8 @@ DEFINE_MUTEX(hfi1_mutex); /* general driver use */
unsigned
int
hfi1_max_mtu
=
HFI1_DEFAULT_MAX_MTU
;
module_param_named
(
max_mtu
,
hfi1_max_mtu
,
uint
,
S_IRUGO
);
MODULE_PARM_DESC
(
max_mtu
,
"Set max MTU bytes, default is 8192"
);
MODULE_PARM_DESC
(
max_mtu
,
"Set max MTU bytes, default is "
__stringify
(
HFI1_DEFAULT_MAX_MTU
));
unsigned
int
hfi1_cu
=
1
;
module_param_named
(
cu
,
hfi1_cu
,
uint
,
S_IRUGO
);
...
...
drivers/staging/rdma/hfi1/firmware.c
View file @
94d7f1a2
...
...
@@ -1413,8 +1413,15 @@ static int __acquire_chip_resource(struct hfi1_devdata *dd, u32 resource)
if
(
resource
&
CR_DYN_MASK
)
{
/* a dynamic resource is in use if either HFI has set the bit */
all_bits
=
resource_mask
(
0
,
resource
)
|
if
(
dd
->
pcidev
->
device
==
PCI_DEVICE_ID_INTEL0
&&
(
resource
&
(
CR_I2C1
|
CR_I2C2
)))
{
/* discrete devices must serialize across both chains */
all_bits
=
resource_mask
(
0
,
CR_I2C1
|
CR_I2C2
)
|
resource_mask
(
1
,
CR_I2C1
|
CR_I2C2
);
}
else
{
all_bits
=
resource_mask
(
0
,
resource
)
|
resource_mask
(
1
,
resource
);
}
my_bit
=
resource_mask
(
dd
->
hfi1_id
,
resource
);
}
else
{
/* non-dynamic resources are not split between HFIs */
...
...
drivers/staging/rdma/hfi1/hfi.h
View file @
94d7f1a2
...
...
@@ -455,9 +455,9 @@ struct rvt_sge_state;
#define HLS_UP (HLS_UP_INIT | HLS_UP_ARMED | HLS_UP_ACTIVE)
/* use this MTU size if none other is given */
#define HFI1_DEFAULT_ACTIVE_MTU
8192
#define HFI1_DEFAULT_ACTIVE_MTU
10240
/* use this MTU size as the default maximum */
#define HFI1_DEFAULT_MAX_MTU
8192
#define HFI1_DEFAULT_MAX_MTU
10240
/* default partition key */
#define DEFAULT_PKEY 0xffff
...
...
@@ -606,7 +606,6 @@ struct hfi1_pportdata {
struct
work_struct
link_vc_work
;
struct
work_struct
link_up_work
;
struct
work_struct
link_down_work
;
struct
work_struct
dc_host_req_work
;
struct
work_struct
sma_message_work
;
struct
work_struct
freeze_work
;
struct
work_struct
link_downgrade_work
;
...
...
@@ -1258,7 +1257,7 @@ void receive_interrupt_work(struct work_struct *work);
static
inline
int
hdr2sc
(
struct
hfi1_message_header
*
hdr
,
u64
rhf
)
{
return
((
be16_to_cpu
(
hdr
->
lrh
[
0
])
>>
12
)
&
0xf
)
|
((
!!
(
rhf
&
RHF_DC_INFO_MASK
))
<<
4
);
((
!!
(
rhf
&
RHF_DC_INFO_
S
MASK
))
<<
4
);
}
static
inline
u16
generate_jkey
(
kuid_t
uid
)
...
...
@@ -1333,6 +1332,9 @@ void process_becn(struct hfi1_pportdata *ppd, u8 sl, u16 rlid, u32 lqpn,
void
return_cnp
(
struct
hfi1_ibport
*
ibp
,
struct
rvt_qp
*
qp
,
u32
remote_qpn
,
u32
pkey
,
u32
slid
,
u32
dlid
,
u8
sc5
,
const
struct
ib_grh
*
old_grh
);
#define PKEY_CHECK_INVALID -1
int
egress_pkey_check
(
struct
hfi1_pportdata
*
ppd
,
__be16
*
lrh
,
__be32
*
bth
,
u8
sc5
,
int8_t
s_pkey_index
);
#define PACKET_EGRESS_TIMEOUT 350
static
inline
void
pause_for_credit_return
(
struct
hfi1_devdata
*
dd
)
...
...
@@ -1776,6 +1778,7 @@ extern struct mutex hfi1_mutex;
#define HFI1_PKT_USER_SC_INTEGRITY \
(SEND_CTXT_CHECK_ENABLE_DISALLOW_NON_KDETH_PACKETS_SMASK \
| SEND_CTXT_CHECK_ENABLE_DISALLOW_KDETH_PACKETS_SMASK \
| SEND_CTXT_CHECK_ENABLE_DISALLOW_BYPASS_SMASK \
| SEND_CTXT_CHECK_ENABLE_DISALLOW_GRH_SMASK)
...
...
drivers/staging/rdma/hfi1/init.c
View file @
94d7f1a2
...
...
@@ -422,9 +422,10 @@ static enum hrtimer_restart cca_timer_fn(struct hrtimer *t)
struct
cca_timer
*
cca_timer
;
struct
hfi1_pportdata
*
ppd
;
int
sl
;
u16
ccti
,
ccti
_timer
,
ccti_min
;
u16
ccti_timer
,
ccti_min
;
struct
cc_state
*
cc_state
;
unsigned
long
flags
;
enum
hrtimer_restart
ret
=
HRTIMER_NORESTART
;
cca_timer
=
container_of
(
t
,
struct
cca_timer
,
hrtimer
);
ppd
=
cca_timer
->
ppd
;
...
...
@@ -450,24 +451,21 @@ static enum hrtimer_restart cca_timer_fn(struct hrtimer *t)
spin_lock_irqsave
(
&
ppd
->
cca_timer_lock
,
flags
);
ccti
=
cca_timer
->
ccti
;
if
(
ccti
>
ccti_min
)
{
if
(
cca_timer
->
ccti
>
ccti_min
)
{
cca_timer
->
ccti
--
;
set_link_ipg
(
ppd
);
}
spin_unlock_irqrestore
(
&
ppd
->
cca_timer_lock
,
flags
);
rcu_read_unlock
();
if
(
ccti
>
ccti_min
)
{
if
(
cca_timer
->
ccti
>
ccti_min
)
{
unsigned
long
nsec
=
1024
*
ccti_timer
;
/* ccti_timer is in units of 1.024 usec */
hrtimer_forward_now
(
t
,
ns_to_ktime
(
nsec
));
ret
urn
HRTIMER_RESTART
;
ret
=
HRTIMER_RESTART
;
}
return
HRTIMER_NORESTART
;
spin_unlock_irqrestore
(
&
ppd
->
cca_timer_lock
,
flags
);
rcu_read_unlock
();
return
ret
;
}
/*
...
...
@@ -496,7 +494,6 @@ void hfi1_init_pportdata(struct pci_dev *pdev, struct hfi1_pportdata *ppd,
INIT_WORK
(
&
ppd
->
link_vc_work
,
handle_verify_cap
);
INIT_WORK
(
&
ppd
->
link_up_work
,
handle_link_up
);
INIT_WORK
(
&
ppd
->
link_down_work
,
handle_link_down
);
INIT_WORK
(
&
ppd
->
dc_host_req_work
,
handle_8051_request
);
INIT_WORK
(
&
ppd
->
freeze_work
,
handle_freeze
);
INIT_WORK
(
&
ppd
->
link_downgrade_work
,
handle_link_downgrade
);
INIT_WORK
(
&
ppd
->
sma_message_work
,
handle_sma_message
);
...
...
@@ -1007,7 +1004,7 @@ void hfi1_free_devdata(struct hfi1_devdata *dd)
free_percpu
(
dd
->
rcv_limit
);
hfi1_dev_affinity_free
(
dd
);
free_percpu
(
dd
->
send_schedule
);
ib_dealloc_device
(
&
dd
->
verbs_dev
.
rdi
.
ibdev
);
rvt_dealloc_device
(
&
dd
->
verbs_dev
.
rdi
);
}
/*
...
...
@@ -1110,7 +1107,7 @@ struct hfi1_devdata *hfi1_alloc_devdata(struct pci_dev *pdev, size_t extra)
bail:
if
(
!
list_empty
(
&
dd
->
list
))
list_del_init
(
&
dd
->
list
);
ib_dealloc_device
(
&
dd
->
verbs_dev
.
rdi
.
ibdev
);
rvt_dealloc_device
(
&
dd
->
verbs_dev
.
rdi
);
return
ERR_PTR
(
ret
);
}
...
...
drivers/staging/rdma/hfi1/mad.c
View file @
94d7f1a2
...
...
@@ -999,7 +999,21 @@ static int set_port_states(struct hfi1_pportdata *ppd, struct opa_smp *smp,
break
;
}
set_link_state
(
ppd
,
link_state
);
if
((
link_state
==
HLS_DN_POLL
||
link_state
==
HLS_DN_DOWNDEF
))
{
/*
* Going to poll. No matter what the current state,
* always move offline first, then tune and start the
* link. This correctly handles a FM link bounce and
* a link enable. Going offline is a no-op if already
* offline.
*/
set_link_state
(
ppd
,
HLS_DN_OFFLINE
);
tune_serdes
(
ppd
);
start_link
(
ppd
);
}
else
{
set_link_state
(
ppd
,
link_state
);
}
if
(
link_state
==
HLS_DN_DISABLE
&&
(
ppd
->
offline_disabled_reason
>
HFI1_ODR_MASK
(
OPA_LINKDOWN_REASON_SMA_DISABLED
)
||
...
...
drivers/staging/rdma/hfi1/mmu_rb.c
View file @
94d7f1a2
...
...
@@ -91,7 +91,7 @@ static unsigned long mmu_node_start(struct mmu_rb_node *node)
static
unsigned
long
mmu_node_last
(
struct
mmu_rb_node
*
node
)
{
return
PAGE_ALIGN
(
(
node
->
addr
&
PAGE_MASK
)
+
node
->
len
)
-
1
;
return
PAGE_ALIGN
(
node
->
addr
+
node
->
len
)
-
1
;
}
int
hfi1_mmu_rb_register
(
struct
rb_root
*
root
,
struct
mmu_rb_ops
*
ops
)
...
...
@@ -126,10 +126,15 @@ void hfi1_mmu_rb_unregister(struct rb_root *root)
if
(
!
handler
)
return
;
/* Unregister first so we don't get any more notifications. */
if
(
current
->
mm
)
mmu_notifier_unregister
(
&
handler
->
mn
,
current
->
mm
);
spin_lock_irqsave
(
&
mmu_rb_lock
,
flags
);
list_del
(
&
handler
->
list
);
spin_unlock_irqrestore
(
&
mmu_rb_lock
,
flags
);
spin_lock_irqsave
(
&
handler
->
lock
,
flags
);
if
(
!
RB_EMPTY_ROOT
(
root
))
{
struct
rb_node
*
node
;
struct
mmu_rb_node
*
rbnode
;
...
...
@@ -141,9 +146,8 @@ void hfi1_mmu_rb_unregister(struct rb_root *root)
handler
->
ops
->
remove
(
root
,
rbnode
,
NULL
);
}
}
spin_unlock_irqrestore
(
&
handler
->
lock
,
flags
);
if
(
current
->
mm
)
mmu_notifier_unregister
(
&
handler
->
mn
,
current
->
mm
);
kfree
(
handler
);
}
...
...
@@ -235,6 +239,25 @@ struct mmu_rb_node *hfi1_mmu_rb_search(struct rb_root *root, unsigned long addr,
return
node
;
}
struct
mmu_rb_node
*
hfi1_mmu_rb_extract
(
struct
rb_root
*
root
,
unsigned
long
addr
,
unsigned
long
len
)
{
struct
mmu_rb_handler
*
handler
=
find_mmu_handler
(
root
);
struct
mmu_rb_node
*
node
;
unsigned
long
flags
;
if
(
!
handler
)
return
ERR_PTR
(
-
EINVAL
);
spin_lock_irqsave
(
&
handler
->
lock
,
flags
);
node
=
__mmu_rb_search
(
handler
,
addr
,
len
);
if
(
node
)
__mmu_int_rb_remove
(
node
,
handler
->
root
);
spin_unlock_irqrestore
(
&
handler
->
lock
,
flags
);
return
node
;
}
void
hfi1_mmu_rb_remove
(
struct
rb_root
*
root
,
struct
mmu_rb_node
*
node
)
{
struct
mmu_rb_handler
*
handler
=
find_mmu_handler
(
root
);
...
...
@@ -293,9 +316,9 @@ static void mmu_notifier_mem_invalidate(struct mmu_notifier *mn,
hfi1_cdbg
(
MMU
,
"Invalidating node addr 0x%llx, len %u"
,
node
->
addr
,
node
->
len
);
if
(
handler
->
ops
->
invalidate
(
root
,
node
))
{
spin_unlock_irqrestore
(
&
handler
->
lock
,
flags
);
__mmu_rb_remove
(
handler
,
node
,
mm
);
spin_lock_irqsave
(
&
handler
->
lock
,
flags
);
__mmu_int_rb_remove
(
node
,
root
);
if
(
handler
->
ops
->
remove
)
handler
->
ops
->
remove
(
root
,
node
,
mm
);
}
}
spin_unlock_irqrestore
(
&
handler
->
lock
,
flags
);
...
...
drivers/staging/rdma/hfi1/mmu_rb.h
View file @
94d7f1a2
...
...
@@ -70,5 +70,7 @@ int hfi1_mmu_rb_insert(struct rb_root *, struct mmu_rb_node *);
void
hfi1_mmu_rb_remove
(
struct
rb_root
*
,
struct
mmu_rb_node
*
);
struct
mmu_rb_node
*
hfi1_mmu_rb_search
(
struct
rb_root
*
,
unsigned
long
,
unsigned
long
);
struct
mmu_rb_node
*
hfi1_mmu_rb_extract
(
struct
rb_root
*
,
unsigned
long
,
unsigned
long
);
#endif
/* _HFI1_MMU_RB_H */
drivers/staging/rdma/hfi1/pio.c
View file @
94d7f1a2
...
...
@@ -139,23 +139,30 @@ void pio_send_control(struct hfi1_devdata *dd, int op)
/* Send Context Size (SCS) wildcards */
#define SCS_POOL_0 -1
#define SCS_POOL_1 -2
/* Send Context Count (SCC) wildcards */
#define SCC_PER_VL -1
#define SCC_PER_CPU -2
#define SCC_PER_KRCVQ -3
#define SCC_ACK_CREDITS 32
/* Send Context Size (SCS) constants */
#define SCS_ACK_CREDITS 32
#define SCS_VL15_CREDITS 102
/* 3 pkts of 2048B data + 128B header */
#define PIO_THRESHOLD_CEILING 4096
#define PIO_WAIT_BATCH_SIZE 5
/* default send context sizes */
static
struct
sc_config_sizes
sc_config_sizes
[
SC_MAX
]
=
{
[
SC_KERNEL
]
=
{
.
size
=
SCS_POOL_0
,
/* even divide, pool 0 */
.
count
=
SCC_PER_VL
},
/* one per NUMA */
[
SC_ACK
]
=
{
.
size
=
SC
C
_ACK_CREDITS
,
.
count
=
SCC_PER_VL
},
/* one per NUMA */
[
SC_ACK
]
=
{
.
size
=
SC
S
_ACK_CREDITS
,
.
count
=
SCC_PER_KRCVQ
},
[
SC_USER
]
=
{
.
size
=
SCS_POOL_0
,
/* even divide, pool 0 */
.
count
=
SCC_PER_CPU
},
/* one per CPU */
[
SC_VL15
]
=
{
.
size
=
SCS_VL15_CREDITS
,
.
count
=
1
},
};
...
...
@@ -202,7 +209,8 @@ static int wildcard_to_pool(int wc)
static
const
char
*
sc_type_names
[
SC_MAX
]
=
{
"kernel"
,
"ack"
,
"user"
"user"
,
"vl15"
};
static
const
char
*
sc_type_name
(
int
index
)
...
...
@@ -230,6 +238,22 @@ int init_sc_pools_and_sizes(struct hfi1_devdata *dd)
int
extra
;
int
i
;