diff options
author | Roland Dreier <roland@topspin.com> | 2005-06-27 17:36:45 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-27 18:11:46 -0400 |
commit | ed878458eeff9754d66f1b0325df6ebbfcdce668 (patch) | |
tree | eab302706f069a7922e1d953b5f33b61bdc868a4 /drivers/infiniband/hw/mthca/mthca_mcg.c | |
parent | 80fd8238734c852a8ed1ea39f8444a2df33bd161 (diff) |
[PATCH] IB/mthca: Align FW command mailboxes to 4K
Future versions of Mellanox HCA firmware will require command mailboxes to be
aligned to 4K. Support this by using a pci_pool to allocate all mailboxes.
This has the added benefit of shrinking the source and text of mthca.
Signed-off-by: Roland Dreier <roland@topspin.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/infiniband/hw/mthca/mthca_mcg.c')
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_mcg.c | 63 |
1 files changed, 32 insertions, 31 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_mcg.c b/drivers/infiniband/hw/mthca/mthca_mcg.c index 70a6553a588e..5be7d949dbf6 100644 --- a/drivers/infiniband/hw/mthca/mthca_mcg.c +++ b/drivers/infiniband/hw/mthca/mthca_mcg.c | |||
@@ -66,22 +66,23 @@ static const u8 zero_gid[16]; /* automatically initialized to 0 */ | |||
66 | * entry in hash chain and *mgm holds end of hash chain. | 66 | * entry in hash chain and *mgm holds end of hash chain. |
67 | */ | 67 | */ |
68 | static int find_mgm(struct mthca_dev *dev, | 68 | static int find_mgm(struct mthca_dev *dev, |
69 | u8 *gid, struct mthca_mgm *mgm, | 69 | u8 *gid, struct mthca_mailbox *mgm_mailbox, |
70 | u16 *hash, int *prev, int *index) | 70 | u16 *hash, int *prev, int *index) |
71 | { | 71 | { |
72 | void *mailbox; | 72 | struct mthca_mailbox *mailbox; |
73 | struct mthca_mgm *mgm = mgm_mailbox->buf; | ||
73 | u8 *mgid; | 74 | u8 *mgid; |
74 | int err; | 75 | int err; |
75 | u8 status; | 76 | u8 status; |
76 | 77 | ||
77 | mailbox = kmalloc(16 + MTHCA_CMD_MAILBOX_EXTRA, GFP_KERNEL); | 78 | mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL); |
78 | if (!mailbox) | 79 | if (IS_ERR(mailbox)) |
79 | return -ENOMEM; | 80 | return -ENOMEM; |
80 | mgid = MAILBOX_ALIGN(mailbox); | 81 | mgid = mailbox->buf; |
81 | 82 | ||
82 | memcpy(mgid, gid, 16); | 83 | memcpy(mgid, gid, 16); |
83 | 84 | ||
84 | err = mthca_MGID_HASH(dev, mgid, hash, &status); | 85 | err = mthca_MGID_HASH(dev, mailbox, hash, &status); |
85 | if (err) | 86 | if (err) |
86 | goto out; | 87 | goto out; |
87 | if (status) { | 88 | if (status) { |
@@ -103,7 +104,7 @@ static int find_mgm(struct mthca_dev *dev, | |||
103 | *prev = -1; | 104 | *prev = -1; |
104 | 105 | ||
105 | do { | 106 | do { |
106 | err = mthca_READ_MGM(dev, *index, mgm, &status); | 107 | err = mthca_READ_MGM(dev, *index, mgm_mailbox, &status); |
107 | if (err) | 108 | if (err) |
108 | goto out; | 109 | goto out; |
109 | if (status) { | 110 | if (status) { |
@@ -129,14 +130,14 @@ static int find_mgm(struct mthca_dev *dev, | |||
129 | *index = -1; | 130 | *index = -1; |
130 | 131 | ||
131 | out: | 132 | out: |
132 | kfree(mailbox); | 133 | mthca_free_mailbox(dev, mailbox); |
133 | return err; | 134 | return err; |
134 | } | 135 | } |
135 | 136 | ||
136 | int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | 137 | int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) |
137 | { | 138 | { |
138 | struct mthca_dev *dev = to_mdev(ibqp->device); | 139 | struct mthca_dev *dev = to_mdev(ibqp->device); |
139 | void *mailbox; | 140 | struct mthca_mailbox *mailbox; |
140 | struct mthca_mgm *mgm; | 141 | struct mthca_mgm *mgm; |
141 | u16 hash; | 142 | u16 hash; |
142 | int index, prev; | 143 | int index, prev; |
@@ -145,15 +146,15 @@ int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | |||
145 | int err; | 146 | int err; |
146 | u8 status; | 147 | u8 status; |
147 | 148 | ||
148 | mailbox = kmalloc(sizeof *mgm + MTHCA_CMD_MAILBOX_EXTRA, GFP_KERNEL); | 149 | mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL); |
149 | if (!mailbox) | 150 | if (IS_ERR(mailbox)) |
150 | return -ENOMEM; | 151 | return PTR_ERR(mailbox); |
151 | mgm = MAILBOX_ALIGN(mailbox); | 152 | mgm = mailbox->buf; |
152 | 153 | ||
153 | if (down_interruptible(&dev->mcg_table.sem)) | 154 | if (down_interruptible(&dev->mcg_table.sem)) |
154 | return -EINTR; | 155 | return -EINTR; |
155 | 156 | ||
156 | err = find_mgm(dev, gid->raw, mgm, &hash, &prev, &index); | 157 | err = find_mgm(dev, gid->raw, mailbox, &hash, &prev, &index); |
157 | if (err) | 158 | if (err) |
158 | goto out; | 159 | goto out; |
159 | 160 | ||
@@ -170,7 +171,7 @@ int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | |||
170 | goto out; | 171 | goto out; |
171 | } | 172 | } |
172 | 173 | ||
173 | err = mthca_READ_MGM(dev, index, mgm, &status); | 174 | err = mthca_READ_MGM(dev, index, mailbox, &status); |
174 | if (err) | 175 | if (err) |
175 | goto out; | 176 | goto out; |
176 | if (status) { | 177 | if (status) { |
@@ -195,7 +196,7 @@ int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | |||
195 | goto out; | 196 | goto out; |
196 | } | 197 | } |
197 | 198 | ||
198 | err = mthca_WRITE_MGM(dev, index, mgm, &status); | 199 | err = mthca_WRITE_MGM(dev, index, mailbox, &status); |
199 | if (err) | 200 | if (err) |
200 | goto out; | 201 | goto out; |
201 | if (status) { | 202 | if (status) { |
@@ -206,7 +207,7 @@ int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | |||
206 | if (!link) | 207 | if (!link) |
207 | goto out; | 208 | goto out; |
208 | 209 | ||
209 | err = mthca_READ_MGM(dev, prev, mgm, &status); | 210 | err = mthca_READ_MGM(dev, prev, mailbox, &status); |
210 | if (err) | 211 | if (err) |
211 | goto out; | 212 | goto out; |
212 | if (status) { | 213 | if (status) { |
@@ -217,7 +218,7 @@ int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | |||
217 | 218 | ||
218 | mgm->next_gid_index = cpu_to_be32(index << 5); | 219 | mgm->next_gid_index = cpu_to_be32(index << 5); |
219 | 220 | ||
220 | err = mthca_WRITE_MGM(dev, prev, mgm, &status); | 221 | err = mthca_WRITE_MGM(dev, prev, mailbox, &status); |
221 | if (err) | 222 | if (err) |
222 | goto out; | 223 | goto out; |
223 | if (status) { | 224 | if (status) { |
@@ -227,14 +228,14 @@ int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | |||
227 | 228 | ||
228 | out: | 229 | out: |
229 | up(&dev->mcg_table.sem); | 230 | up(&dev->mcg_table.sem); |
230 | kfree(mailbox); | 231 | mthca_free_mailbox(dev, mailbox); |
231 | return err; | 232 | return err; |
232 | } | 233 | } |
233 | 234 | ||
234 | int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | 235 | int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) |
235 | { | 236 | { |
236 | struct mthca_dev *dev = to_mdev(ibqp->device); | 237 | struct mthca_dev *dev = to_mdev(ibqp->device); |
237 | void *mailbox; | 238 | struct mthca_mailbox *mailbox; |
238 | struct mthca_mgm *mgm; | 239 | struct mthca_mgm *mgm; |
239 | u16 hash; | 240 | u16 hash; |
240 | int prev, index; | 241 | int prev, index; |
@@ -242,15 +243,15 @@ int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | |||
242 | int err; | 243 | int err; |
243 | u8 status; | 244 | u8 status; |
244 | 245 | ||
245 | mailbox = kmalloc(sizeof *mgm + MTHCA_CMD_MAILBOX_EXTRA, GFP_KERNEL); | 246 | mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL); |
246 | if (!mailbox) | 247 | if (IS_ERR(mailbox)) |
247 | return -ENOMEM; | 248 | return PTR_ERR(mailbox); |
248 | mgm = MAILBOX_ALIGN(mailbox); | 249 | mgm = mailbox->buf; |
249 | 250 | ||
250 | if (down_interruptible(&dev->mcg_table.sem)) | 251 | if (down_interruptible(&dev->mcg_table.sem)) |
251 | return -EINTR; | 252 | return -EINTR; |
252 | 253 | ||
253 | err = find_mgm(dev, gid->raw, mgm, &hash, &prev, &index); | 254 | err = find_mgm(dev, gid->raw, mailbox, &hash, &prev, &index); |
254 | if (err) | 255 | if (err) |
255 | goto out; | 256 | goto out; |
256 | 257 | ||
@@ -285,7 +286,7 @@ int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | |||
285 | mgm->qp[loc] = mgm->qp[i - 1]; | 286 | mgm->qp[loc] = mgm->qp[i - 1]; |
286 | mgm->qp[i - 1] = 0; | 287 | mgm->qp[i - 1] = 0; |
287 | 288 | ||
288 | err = mthca_WRITE_MGM(dev, index, mgm, &status); | 289 | err = mthca_WRITE_MGM(dev, index, mailbox, &status); |
289 | if (err) | 290 | if (err) |
290 | goto out; | 291 | goto out; |
291 | if (status) { | 292 | if (status) { |
@@ -304,7 +305,7 @@ int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | |||
304 | if (be32_to_cpu(mgm->next_gid_index) >> 5) { | 305 | if (be32_to_cpu(mgm->next_gid_index) >> 5) { |
305 | err = mthca_READ_MGM(dev, | 306 | err = mthca_READ_MGM(dev, |
306 | be32_to_cpu(mgm->next_gid_index) >> 5, | 307 | be32_to_cpu(mgm->next_gid_index) >> 5, |
307 | mgm, &status); | 308 | mailbox, &status); |
308 | if (err) | 309 | if (err) |
309 | goto out; | 310 | goto out; |
310 | if (status) { | 311 | if (status) { |
@@ -316,7 +317,7 @@ int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | |||
316 | } else | 317 | } else |
317 | memset(mgm->gid, 0, 16); | 318 | memset(mgm->gid, 0, 16); |
318 | 319 | ||
319 | err = mthca_WRITE_MGM(dev, index, mgm, &status); | 320 | err = mthca_WRITE_MGM(dev, index, mailbox, &status); |
320 | if (err) | 321 | if (err) |
321 | goto out; | 322 | goto out; |
322 | if (status) { | 323 | if (status) { |
@@ -327,7 +328,7 @@ int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | |||
327 | } else { | 328 | } else { |
328 | /* Remove entry from AMGM */ | 329 | /* Remove entry from AMGM */ |
329 | index = be32_to_cpu(mgm->next_gid_index) >> 5; | 330 | index = be32_to_cpu(mgm->next_gid_index) >> 5; |
330 | err = mthca_READ_MGM(dev, prev, mgm, &status); | 331 | err = mthca_READ_MGM(dev, prev, mailbox, &status); |
331 | if (err) | 332 | if (err) |
332 | goto out; | 333 | goto out; |
333 | if (status) { | 334 | if (status) { |
@@ -338,7 +339,7 @@ int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | |||
338 | 339 | ||
339 | mgm->next_gid_index = cpu_to_be32(index << 5); | 340 | mgm->next_gid_index = cpu_to_be32(index << 5); |
340 | 341 | ||
341 | err = mthca_WRITE_MGM(dev, prev, mgm, &status); | 342 | err = mthca_WRITE_MGM(dev, prev, mailbox, &status); |
342 | if (err) | 343 | if (err) |
343 | goto out; | 344 | goto out; |
344 | if (status) { | 345 | if (status) { |
@@ -350,7 +351,7 @@ int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid) | |||
350 | 351 | ||
351 | out: | 352 | out: |
352 | up(&dev->mcg_table.sem); | 353 | up(&dev->mcg_table.sem); |
353 | kfree(mailbox); | 354 | mthca_free_mailbox(dev, mailbox); |
354 | return err; | 355 | return err; |
355 | } | 356 | } |
356 | 357 | ||