diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-18 11:20:06 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-18 11:20:06 -0400 |
commit | 75e98b34155264d943aa53edce465e87f3ccbadf (patch) | |
tree | 08d100a14ab9f5314c393286ce8c5436ef387d75 /drivers/net | |
parent | 30bc94566e396b432b72e2f3518e19225dc2672d (diff) | |
parent | 0a22ab92f51478796d5f3997f4f5922409c98b10 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: (104 commits)
IB/iser: Don't change itt endianness
IB/mlx4: Update module version and release date
IPoIB: Handle case when P_Key is deleted and re-added at same index
IB/iser: Release connection resources on RDMA_CM_EVENT_DEVICE_REMOVAL event
IB/mlx4: Fix incorrect comment
IB/mlx4: Fix race when detaching a QP from a multicast group
IB/ehca: Support all ibv_devinfo values in query_device() and query_port()
RDMA/nes: Free IRQ before killing tasklet
IB/mthca: Update module version and release date
IB/mlx4: Update QP state if query QP succeeds
IB/mthca: Update QP state if query QP succeeds
RDMA/amso1100: Add check for NULL reply_msg in c2_intr()
IB/mlx4: Add support for resizing CQs
IB/mlx4: Add support for modifying CQ moderation parameters
IPoIB: Support modifying IPoIB CQ event moderation
IB/core: Add support for modify CQ
IPoIB: Add basic ethtool support
mlx4_core: Increase max number of QPs to 128K
RDMA/amso1100: Add support for "send with invalidate" work requests
IB/core: Add support for "send with invalidate" work requests
...
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/mlx4/catas.c | 2 | ||||
-rw-r--r-- | drivers/net/mlx4/cmd.c | 3 | ||||
-rw-r--r-- | drivers/net/mlx4/cq.c | 72 | ||||
-rw-r--r-- | drivers/net/mlx4/eq.c | 5 | ||||
-rw-r--r-- | drivers/net/mlx4/fw.c | 13 | ||||
-rw-r--r-- | drivers/net/mlx4/fw.h | 1 | ||||
-rw-r--r-- | drivers/net/mlx4/intf.c | 8 | ||||
-rw-r--r-- | drivers/net/mlx4/main.c | 6 | ||||
-rw-r--r-- | drivers/net/mlx4/mcg.c | 12 | ||||
-rw-r--r-- | drivers/net/mlx4/mlx4.h | 4 |
10 files changed, 96 insertions, 30 deletions
diff --git a/drivers/net/mlx4/catas.c b/drivers/net/mlx4/catas.c index 6b32ec94b3a8..aa9528779044 100644 --- a/drivers/net/mlx4/catas.c +++ b/drivers/net/mlx4/catas.c | |||
@@ -69,7 +69,7 @@ static void poll_catas(unsigned long dev_ptr) | |||
69 | if (readl(priv->catas_err.map)) { | 69 | if (readl(priv->catas_err.map)) { |
70 | dump_err_buf(dev); | 70 | dump_err_buf(dev); |
71 | 71 | ||
72 | mlx4_dispatch_event(dev, MLX4_EVENT_TYPE_LOCAL_CATAS_ERROR, 0, 0); | 72 | mlx4_dispatch_event(dev, MLX4_DEV_EVENT_CATASTROPHIC_ERROR, 0); |
73 | 73 | ||
74 | if (internal_err_reset) { | 74 | if (internal_err_reset) { |
75 | spin_lock(&catas_lock); | 75 | spin_lock(&catas_lock); |
diff --git a/drivers/net/mlx4/cmd.c b/drivers/net/mlx4/cmd.c index db49051b97b1..70dff94a8bc6 100644 --- a/drivers/net/mlx4/cmd.c +++ b/drivers/net/mlx4/cmd.c | |||
@@ -106,7 +106,8 @@ struct mlx4_cmd_context { | |||
106 | u16 token; | 106 | u16 token; |
107 | }; | 107 | }; |
108 | 108 | ||
109 | static int mlx4_status_to_errno(u8 status) { | 109 | static int mlx4_status_to_errno(u8 status) |
110 | { | ||
110 | static const int trans_table[] = { | 111 | static const int trans_table[] = { |
111 | [CMD_STAT_INTERNAL_ERR] = -EIO, | 112 | [CMD_STAT_INTERNAL_ERR] = -EIO, |
112 | [CMD_STAT_BAD_OP] = -EPERM, | 113 | [CMD_STAT_BAD_OP] = -EPERM, |
diff --git a/drivers/net/mlx4/cq.c b/drivers/net/mlx4/cq.c index d4441fee3d80..caa5bcf54e35 100644 --- a/drivers/net/mlx4/cq.c +++ b/drivers/net/mlx4/cq.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <linux/hardirq.h> | 38 | #include <linux/hardirq.h> |
39 | 39 | ||
40 | #include <linux/mlx4/cmd.h> | 40 | #include <linux/mlx4/cmd.h> |
41 | #include <linux/mlx4/cq.h> | ||
41 | 42 | ||
42 | #include "mlx4.h" | 43 | #include "mlx4.h" |
43 | #include "icm.h" | 44 | #include "icm.h" |
@@ -47,21 +48,19 @@ struct mlx4_cq_context { | |||
47 | u16 reserved1[3]; | 48 | u16 reserved1[3]; |
48 | __be16 page_offset; | 49 | __be16 page_offset; |
49 | __be32 logsize_usrpage; | 50 | __be32 logsize_usrpage; |
50 | u8 reserved2; | 51 | __be16 cq_period; |
51 | u8 cq_period; | 52 | __be16 cq_max_count; |
52 | u8 reserved3; | 53 | u8 reserved2[3]; |
53 | u8 cq_max_count; | ||
54 | u8 reserved4[3]; | ||
55 | u8 comp_eqn; | 54 | u8 comp_eqn; |
56 | u8 log_page_size; | 55 | u8 log_page_size; |
57 | u8 reserved5[2]; | 56 | u8 reserved3[2]; |
58 | u8 mtt_base_addr_h; | 57 | u8 mtt_base_addr_h; |
59 | __be32 mtt_base_addr_l; | 58 | __be32 mtt_base_addr_l; |
60 | __be32 last_notified_index; | 59 | __be32 last_notified_index; |
61 | __be32 solicit_producer_index; | 60 | __be32 solicit_producer_index; |
62 | __be32 consumer_index; | 61 | __be32 consumer_index; |
63 | __be32 producer_index; | 62 | __be32 producer_index; |
64 | u32 reserved6[2]; | 63 | u32 reserved4[2]; |
65 | __be64 db_rec_addr; | 64 | __be64 db_rec_addr; |
66 | }; | 65 | }; |
67 | 66 | ||
@@ -121,6 +120,13 @@ static int mlx4_SW2HW_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, | |||
121 | MLX4_CMD_TIME_CLASS_A); | 120 | MLX4_CMD_TIME_CLASS_A); |
122 | } | 121 | } |
123 | 122 | ||
123 | static int mlx4_MODIFY_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, | ||
124 | int cq_num, u32 opmod) | ||
125 | { | ||
126 | return mlx4_cmd(dev, mailbox->dma, cq_num, opmod, MLX4_CMD_MODIFY_CQ, | ||
127 | MLX4_CMD_TIME_CLASS_A); | ||
128 | } | ||
129 | |||
124 | static int mlx4_HW2SW_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, | 130 | static int mlx4_HW2SW_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, |
125 | int cq_num) | 131 | int cq_num) |
126 | { | 132 | { |
@@ -129,6 +135,58 @@ static int mlx4_HW2SW_CQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, | |||
129 | MLX4_CMD_TIME_CLASS_A); | 135 | MLX4_CMD_TIME_CLASS_A); |
130 | } | 136 | } |
131 | 137 | ||
138 | int mlx4_cq_modify(struct mlx4_dev *dev, struct mlx4_cq *cq, | ||
139 | u16 count, u16 period) | ||
140 | { | ||
141 | struct mlx4_cmd_mailbox *mailbox; | ||
142 | struct mlx4_cq_context *cq_context; | ||
143 | int err; | ||
144 | |||
145 | mailbox = mlx4_alloc_cmd_mailbox(dev); | ||
146 | if (IS_ERR(mailbox)) | ||
147 | return PTR_ERR(mailbox); | ||
148 | |||
149 | cq_context = mailbox->buf; | ||
150 | memset(cq_context, 0, sizeof *cq_context); | ||
151 | |||
152 | cq_context->cq_max_count = cpu_to_be16(count); | ||
153 | cq_context->cq_period = cpu_to_be16(period); | ||
154 | |||
155 | err = mlx4_MODIFY_CQ(dev, mailbox, cq->cqn, 1); | ||
156 | |||
157 | mlx4_free_cmd_mailbox(dev, mailbox); | ||
158 | return err; | ||
159 | } | ||
160 | EXPORT_SYMBOL_GPL(mlx4_cq_modify); | ||
161 | |||
162 | int mlx4_cq_resize(struct mlx4_dev *dev, struct mlx4_cq *cq, | ||
163 | int entries, struct mlx4_mtt *mtt) | ||
164 | { | ||
165 | struct mlx4_cmd_mailbox *mailbox; | ||
166 | struct mlx4_cq_context *cq_context; | ||
167 | u64 mtt_addr; | ||
168 | int err; | ||
169 | |||
170 | mailbox = mlx4_alloc_cmd_mailbox(dev); | ||
171 | if (IS_ERR(mailbox)) | ||
172 | return PTR_ERR(mailbox); | ||
173 | |||
174 | cq_context = mailbox->buf; | ||
175 | memset(cq_context, 0, sizeof *cq_context); | ||
176 | |||
177 | cq_context->logsize_usrpage = cpu_to_be32(ilog2(entries) << 24); | ||
178 | cq_context->log_page_size = mtt->page_shift - 12; | ||
179 | mtt_addr = mlx4_mtt_addr(dev, mtt); | ||
180 | cq_context->mtt_base_addr_h = mtt_addr >> 32; | ||
181 | cq_context->mtt_base_addr_l = cpu_to_be32(mtt_addr & 0xffffffff); | ||
182 | |||
183 | err = mlx4_MODIFY_CQ(dev, mailbox, cq->cqn, 1); | ||
184 | |||
185 | mlx4_free_cmd_mailbox(dev, mailbox); | ||
186 | return err; | ||
187 | } | ||
188 | EXPORT_SYMBOL_GPL(mlx4_cq_resize); | ||
189 | |||
132 | int mlx4_cq_alloc(struct mlx4_dev *dev, int nent, struct mlx4_mtt *mtt, | 190 | int mlx4_cq_alloc(struct mlx4_dev *dev, int nent, struct mlx4_mtt *mtt, |
133 | struct mlx4_uar *uar, u64 db_rec, struct mlx4_cq *cq) | 191 | struct mlx4_uar *uar, u64 db_rec, struct mlx4_cq *cq) |
134 | { | 192 | { |
diff --git a/drivers/net/mlx4/eq.c b/drivers/net/mlx4/eq.c index 9c36c2034030..e141a1513f07 100644 --- a/drivers/net/mlx4/eq.c +++ b/drivers/net/mlx4/eq.c | |||
@@ -202,7 +202,10 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) | |||
202 | break; | 202 | break; |
203 | 203 | ||
204 | case MLX4_EVENT_TYPE_PORT_CHANGE: | 204 | case MLX4_EVENT_TYPE_PORT_CHANGE: |
205 | mlx4_dispatch_event(dev, eqe->type, eqe->subtype, | 205 | mlx4_dispatch_event(dev, |
206 | eqe->subtype == MLX4_PORT_CHANGE_SUBTYPE_ACTIVE ? | ||
207 | MLX4_DEV_EVENT_PORT_UP : | ||
208 | MLX4_DEV_EVENT_PORT_DOWN, | ||
206 | be32_to_cpu(eqe->event.port_change.port) >> 28); | 209 | be32_to_cpu(eqe->event.port_change.port) >> 28); |
207 | break; | 210 | break; |
208 | 211 | ||
diff --git a/drivers/net/mlx4/fw.c b/drivers/net/mlx4/fw.c index 61dc4951d6b0..d82f2751d2c7 100644 --- a/drivers/net/mlx4/fw.c +++ b/drivers/net/mlx4/fw.c | |||
@@ -133,6 +133,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap) | |||
133 | #define QUERY_DEV_CAP_MAX_AV_OFFSET 0x27 | 133 | #define QUERY_DEV_CAP_MAX_AV_OFFSET 0x27 |
134 | #define QUERY_DEV_CAP_MAX_REQ_QP_OFFSET 0x29 | 134 | #define QUERY_DEV_CAP_MAX_REQ_QP_OFFSET 0x29 |
135 | #define QUERY_DEV_CAP_MAX_RES_QP_OFFSET 0x2b | 135 | #define QUERY_DEV_CAP_MAX_RES_QP_OFFSET 0x2b |
136 | #define QUERY_DEV_CAP_MAX_GSO_OFFSET 0x2d | ||
136 | #define QUERY_DEV_CAP_MAX_RDMA_OFFSET 0x2f | 137 | #define QUERY_DEV_CAP_MAX_RDMA_OFFSET 0x2f |
137 | #define QUERY_DEV_CAP_RSZ_SRQ_OFFSET 0x33 | 138 | #define QUERY_DEV_CAP_RSZ_SRQ_OFFSET 0x33 |
138 | #define QUERY_DEV_CAP_ACK_DELAY_OFFSET 0x35 | 139 | #define QUERY_DEV_CAP_ACK_DELAY_OFFSET 0x35 |
@@ -215,6 +216,13 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap) | |||
215 | dev_cap->max_requester_per_qp = 1 << (field & 0x3f); | 216 | dev_cap->max_requester_per_qp = 1 << (field & 0x3f); |
216 | MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_RES_QP_OFFSET); | 217 | MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_RES_QP_OFFSET); |
217 | dev_cap->max_responder_per_qp = 1 << (field & 0x3f); | 218 | dev_cap->max_responder_per_qp = 1 << (field & 0x3f); |
219 | MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_GSO_OFFSET); | ||
220 | field &= 0x1f; | ||
221 | if (!field) | ||
222 | dev_cap->max_gso_sz = 0; | ||
223 | else | ||
224 | dev_cap->max_gso_sz = 1 << field; | ||
225 | |||
218 | MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_RDMA_OFFSET); | 226 | MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_RDMA_OFFSET); |
219 | dev_cap->max_rdma_global = 1 << (field & 0x3f); | 227 | dev_cap->max_rdma_global = 1 << (field & 0x3f); |
220 | MLX4_GET(field, outbox, QUERY_DEV_CAP_ACK_DELAY_OFFSET); | 228 | MLX4_GET(field, outbox, QUERY_DEV_CAP_ACK_DELAY_OFFSET); |
@@ -377,6 +385,7 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap) | |||
377 | dev_cap->max_sq_desc_sz, dev_cap->max_sq_sg); | 385 | dev_cap->max_sq_desc_sz, dev_cap->max_sq_sg); |
378 | mlx4_dbg(dev, "Max RQ desc size: %d, max RQ S/G: %d\n", | 386 | mlx4_dbg(dev, "Max RQ desc size: %d, max RQ S/G: %d\n", |
379 | dev_cap->max_rq_desc_sz, dev_cap->max_rq_sg); | 387 | dev_cap->max_rq_desc_sz, dev_cap->max_rq_sg); |
388 | mlx4_dbg(dev, "Max GSO size: %d\n", dev_cap->max_gso_sz); | ||
380 | 389 | ||
381 | dump_dev_cap_flags(dev, dev_cap->flags); | 390 | dump_dev_cap_flags(dev, dev_cap->flags); |
382 | 391 | ||
@@ -696,6 +705,10 @@ int mlx4_INIT_HCA(struct mlx4_dev *dev, struct mlx4_init_hca_param *param) | |||
696 | /* Check port for UD address vector: */ | 705 | /* Check port for UD address vector: */ |
697 | *(inbox + INIT_HCA_FLAGS_OFFSET / 4) |= cpu_to_be32(1); | 706 | *(inbox + INIT_HCA_FLAGS_OFFSET / 4) |= cpu_to_be32(1); |
698 | 707 | ||
708 | /* Enable IPoIB checksumming if we can: */ | ||
709 | if (dev->caps.flags & MLX4_DEV_CAP_FLAG_IPOIB_CSUM) | ||
710 | *(inbox + INIT_HCA_FLAGS_OFFSET / 4) |= cpu_to_be32(1 << 3); | ||
711 | |||
699 | /* QPC/EEC/CQC/EQC/RDMARC attributes */ | 712 | /* QPC/EEC/CQC/EQC/RDMARC attributes */ |
700 | 713 | ||
701 | MLX4_PUT(inbox, param->qpc_base, INIT_HCA_QPC_BASE_OFFSET); | 714 | MLX4_PUT(inbox, param->qpc_base, INIT_HCA_QPC_BASE_OFFSET); |
diff --git a/drivers/net/mlx4/fw.h b/drivers/net/mlx4/fw.h index e16dec890413..306cb9b0242d 100644 --- a/drivers/net/mlx4/fw.h +++ b/drivers/net/mlx4/fw.h | |||
@@ -96,6 +96,7 @@ struct mlx4_dev_cap { | |||
96 | u8 bmme_flags; | 96 | u8 bmme_flags; |
97 | u32 reserved_lkey; | 97 | u32 reserved_lkey; |
98 | u64 max_icm_sz; | 98 | u64 max_icm_sz; |
99 | int max_gso_sz; | ||
99 | }; | 100 | }; |
100 | 101 | ||
101 | struct mlx4_adapter { | 102 | struct mlx4_adapter { |
diff --git a/drivers/net/mlx4/intf.c b/drivers/net/mlx4/intf.c index be5d9e90ccf2..4a6c4d526f1b 100644 --- a/drivers/net/mlx4/intf.c +++ b/drivers/net/mlx4/intf.c | |||
@@ -30,8 +30,6 @@ | |||
30 | * SOFTWARE. | 30 | * SOFTWARE. |
31 | */ | 31 | */ |
32 | 32 | ||
33 | #include <linux/mlx4/driver.h> | ||
34 | |||
35 | #include "mlx4.h" | 33 | #include "mlx4.h" |
36 | 34 | ||
37 | struct mlx4_device_context { | 35 | struct mlx4_device_context { |
@@ -113,8 +111,7 @@ void mlx4_unregister_interface(struct mlx4_interface *intf) | |||
113 | } | 111 | } |
114 | EXPORT_SYMBOL_GPL(mlx4_unregister_interface); | 112 | EXPORT_SYMBOL_GPL(mlx4_unregister_interface); |
115 | 113 | ||
116 | void mlx4_dispatch_event(struct mlx4_dev *dev, enum mlx4_event type, | 114 | void mlx4_dispatch_event(struct mlx4_dev *dev, enum mlx4_dev_event type, int port) |
117 | int subtype, int port) | ||
118 | { | 115 | { |
119 | struct mlx4_priv *priv = mlx4_priv(dev); | 116 | struct mlx4_priv *priv = mlx4_priv(dev); |
120 | struct mlx4_device_context *dev_ctx; | 117 | struct mlx4_device_context *dev_ctx; |
@@ -124,8 +121,7 @@ void mlx4_dispatch_event(struct mlx4_dev *dev, enum mlx4_event type, | |||
124 | 121 | ||
125 | list_for_each_entry(dev_ctx, &priv->ctx_list, list) | 122 | list_for_each_entry(dev_ctx, &priv->ctx_list, list) |
126 | if (dev_ctx->intf->event) | 123 | if (dev_ctx->intf->event) |
127 | dev_ctx->intf->event(dev, dev_ctx->context, type, | 124 | dev_ctx->intf->event(dev, dev_ctx->context, type, port); |
128 | subtype, port); | ||
129 | 125 | ||
130 | spin_unlock_irqrestore(&priv->ctx_lock, flags); | 126 | spin_unlock_irqrestore(&priv->ctx_lock, flags); |
131 | } | 127 | } |
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c index 08bfc130a33e..49a4acab5e82 100644 --- a/drivers/net/mlx4/main.c +++ b/drivers/net/mlx4/main.c | |||
@@ -76,7 +76,7 @@ static char mlx4_version[] __devinitdata = | |||
76 | DRV_VERSION " (" DRV_RELDATE ")\n"; | 76 | DRV_VERSION " (" DRV_RELDATE ")\n"; |
77 | 77 | ||
78 | static struct mlx4_profile default_profile = { | 78 | static struct mlx4_profile default_profile = { |
79 | .num_qp = 1 << 16, | 79 | .num_qp = 1 << 17, |
80 | .num_srq = 1 << 16, | 80 | .num_srq = 1 << 16, |
81 | .rdmarc_per_qp = 1 << 4, | 81 | .rdmarc_per_qp = 1 << 4, |
82 | .num_cq = 1 << 16, | 82 | .num_cq = 1 << 16, |
@@ -159,6 +159,7 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap) | |||
159 | dev->caps.page_size_cap = ~(u32) (dev_cap->min_page_sz - 1); | 159 | dev->caps.page_size_cap = ~(u32) (dev_cap->min_page_sz - 1); |
160 | dev->caps.flags = dev_cap->flags; | 160 | dev->caps.flags = dev_cap->flags; |
161 | dev->caps.stat_rate_support = dev_cap->stat_rate_support; | 161 | dev->caps.stat_rate_support = dev_cap->stat_rate_support; |
162 | dev->caps.max_gso_sz = dev_cap->max_gso_sz; | ||
162 | 163 | ||
163 | return 0; | 164 | return 0; |
164 | } | 165 | } |
@@ -735,8 +736,7 @@ static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
735 | } | 736 | } |
736 | 737 | ||
737 | /* | 738 | /* |
738 | * Check for BARs. We expect 0: 1MB, 2: 8MB, 4: DDR (may not | 739 | * Check for BARs. We expect 0: 1MB |
739 | * be present) | ||
740 | */ | 740 | */ |
741 | if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM) || | 741 | if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM) || |
742 | pci_resource_len(pdev, 0) != 1 << 20) { | 742 | pci_resource_len(pdev, 0) != 1 << 20) { |
diff --git a/drivers/net/mlx4/mcg.c b/drivers/net/mlx4/mcg.c index a99e7729d333..57f7f1f0d4ec 100644 --- a/drivers/net/mlx4/mcg.c +++ b/drivers/net/mlx4/mcg.c | |||
@@ -190,10 +190,6 @@ int mlx4_multicast_attach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16]) | |||
190 | } | 190 | } |
191 | index += dev->caps.num_mgms; | 191 | index += dev->caps.num_mgms; |
192 | 192 | ||
193 | err = mlx4_READ_MCG(dev, index, mailbox); | ||
194 | if (err) | ||
195 | goto out; | ||
196 | |||
197 | memset(mgm, 0, sizeof *mgm); | 193 | memset(mgm, 0, sizeof *mgm); |
198 | memcpy(mgm->gid, gid, 16); | 194 | memcpy(mgm->gid, gid, 16); |
199 | } | 195 | } |
@@ -301,12 +297,10 @@ int mlx4_multicast_detach(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16]) | |||
301 | mgm->qp[loc] = mgm->qp[i - 1]; | 297 | mgm->qp[loc] = mgm->qp[i - 1]; |
302 | mgm->qp[i - 1] = 0; | 298 | mgm->qp[i - 1] = 0; |
303 | 299 | ||
304 | err = mlx4_WRITE_MCG(dev, index, mailbox); | 300 | if (i != 1) { |
305 | if (err) | 301 | err = mlx4_WRITE_MCG(dev, index, mailbox); |
306 | goto out; | ||
307 | |||
308 | if (i != 1) | ||
309 | goto out; | 302 | goto out; |
303 | } | ||
310 | 304 | ||
311 | if (prev == -1) { | 305 | if (prev == -1) { |
312 | /* Remove entry from MGM */ | 306 | /* Remove entry from MGM */ |
diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h index 53a1cdddfc13..73336810e652 100644 --- a/drivers/net/mlx4/mlx4.h +++ b/drivers/net/mlx4/mlx4.h | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <linux/timer.h> | 42 | #include <linux/timer.h> |
43 | 43 | ||
44 | #include <linux/mlx4/device.h> | 44 | #include <linux/mlx4/device.h> |
45 | #include <linux/mlx4/driver.h> | ||
45 | #include <linux/mlx4/doorbell.h> | 46 | #include <linux/mlx4/doorbell.h> |
46 | 47 | ||
47 | #define DRV_NAME "mlx4_core" | 48 | #define DRV_NAME "mlx4_core" |
@@ -313,8 +314,7 @@ void mlx4_catas_cleanup(void); | |||
313 | int mlx4_restart_one(struct pci_dev *pdev); | 314 | int mlx4_restart_one(struct pci_dev *pdev); |
314 | int mlx4_register_device(struct mlx4_dev *dev); | 315 | int mlx4_register_device(struct mlx4_dev *dev); |
315 | void mlx4_unregister_device(struct mlx4_dev *dev); | 316 | void mlx4_unregister_device(struct mlx4_dev *dev); |
316 | void mlx4_dispatch_event(struct mlx4_dev *dev, enum mlx4_event type, | 317 | void mlx4_dispatch_event(struct mlx4_dev *dev, enum mlx4_dev_event type, int port); |
317 | int subtype, int port); | ||
318 | 318 | ||
319 | struct mlx4_dev_cap; | 319 | struct mlx4_dev_cap; |
320 | struct mlx4_init_hca_param; | 320 | struct mlx4_init_hca_param; |