aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211/brcmfmac
diff options
context:
space:
mode:
authorArend van Spriel <arend@broadcom.com>2011-11-22 20:21:44 -0500
committerJohn W. Linville <linville@tuxdriver.com>2011-11-28 14:43:33 -0500
commit8054321b7cb8c685f21762268b20dc590dab2a8d (patch)
tree35ea29f27d613146d2ec86c1a537cc0bec40372e /drivers/net/wireless/brcm80211/brcmfmac
parentbe667669ec01d514b3820f8c74d9336115be6aa7 (diff)
brcm80211: fmac: remove alignment check from brcmf_sdioh_request_buffer()
The check for alignment is not valid anymore and can be removed. The function is collapsed with brcmf_sdioh_request_packet() as a consequence because it did not add much functionality any longer. Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Reviewed-by: Alwin Beukers <alwin@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: Franky Lin <frankyl@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c100
1 files changed, 18 insertions, 82 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
index 2263d3cab2c3..ccb32c01d527 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
@@ -229,44 +229,6 @@ brcmf_sdioh_request_data(struct brcmf_sdio_dev *sdiodev, uint write, bool fifo,
229 return err_ret; 229 return err_ret;
230} 230}
231 231
232static int
233brcmf_sdioh_request_packet(struct brcmf_sdio_dev *sdiodev, uint fix_inc,
234 uint write, uint func, uint addr,
235 struct sk_buff *pkt)
236{
237 bool fifo = (fix_inc == SDIOH_DATA_FIX);
238 int err_ret = 0;
239 uint pkt_len = pkt->len;
240
241 brcmf_dbg(TRACE, "Enter\n");
242
243 brcmf_pm_resume_wait(sdiodev, &sdiodev->request_packet_wait);
244 if (brcmf_pm_resume_error(sdiodev))
245 return -EIO;
246
247 /* Claim host controller */
248 sdio_claim_host(sdiodev->func[func]);
249
250 pkt_len += 3;
251 pkt_len &= 0xFFFFFFFC;
252
253 err_ret = brcmf_sdioh_request_data(sdiodev, write, fifo, func,
254 addr, pkt, pkt_len);
255 if (err_ret) {
256 brcmf_dbg(ERROR, "%s FAILED %p, addr=0x%05x, pkt_len=%d, ERR=0x%08x\n",
257 write ? "TX" : "RX", pkt, addr, pkt_len, err_ret);
258 } else {
259 brcmf_dbg(TRACE, "%s xfr'd %p, addr=0x%05x, len=%d\n",
260 write ? "TX" : "RX", pkt, addr, pkt_len);
261 }
262
263 /* Release host controller */
264 sdio_release_host(sdiodev->func[func]);
265
266 brcmf_dbg(TRACE, "Exit\n");
267 return err_ret;
268}
269
270int 232int
271brcmf_sdioh_request_chain(struct brcmf_sdio_dev *sdiodev, uint fix_inc, 233brcmf_sdioh_request_chain(struct brcmf_sdio_dev *sdiodev, uint fix_inc,
272 uint write, uint func, uint addr, 234 uint write, uint func, uint addr,
@@ -317,26 +279,15 @@ brcmf_sdioh_request_chain(struct brcmf_sdio_dev *sdiodev, uint fix_inc,
317} 279}
318 280
319/* 281/*
320 * This function takes a buffer or packet, and fixes everything up 282 * This function takes a single DMA-able packet.
321 * so that in the end, a DMA-able packet is created.
322 *
323 * A buffer does not have an associated packet pointer,
324 * and may or may not be aligned.
325 * A packet may consist of a single packet, or a packet chain.
326 * If it is a packet chain, then all the packets in the chain
327 * must be properly aligned.
328 *
329 * If the packet data is not aligned, then there may only be
330 * one packet, and in this case, it is copied to a new
331 * aligned packet.
332 *
333 */ 283 */
334int brcmf_sdioh_request_buffer(struct brcmf_sdio_dev *sdiodev, 284int brcmf_sdioh_request_buffer(struct brcmf_sdio_dev *sdiodev,
335 uint fix_inc, uint write, uint func, uint addr, 285 uint fix_inc, uint write, uint func, uint addr,
336 struct sk_buff *pkt) 286 struct sk_buff *pkt)
337{ 287{
338 int status; 288 int status;
339 struct sk_buff *mypkt = NULL; 289 uint pkt_len = pkt->len;
290 bool fifo = (fix_inc == SDIOH_DATA_FIX);
340 291
341 brcmf_dbg(TRACE, "Enter\n"); 292 brcmf_dbg(TRACE, "Enter\n");
342 293
@@ -347,40 +298,25 @@ int brcmf_sdioh_request_buffer(struct brcmf_sdio_dev *sdiodev,
347 if (brcmf_pm_resume_error(sdiodev)) 298 if (brcmf_pm_resume_error(sdiodev))
348 return -EIO; 299 return -EIO;
349 300
350 if (((ulong) (pkt->data) & DMA_ALIGN_MASK) != 0) { 301 /* Claim host controller */
351 /* 302 sdio_claim_host(sdiodev->func[func]);
352 * Case 2: We have a packet, but it is unaligned.
353 * In this case, we cannot have a chain (pkt->next == NULL)
354 */
355 brcmf_dbg(DATA, "Creating aligned %s Packet, len=%d\n",
356 write ? "TX" : "RX", pkt->len);
357 mypkt = brcmu_pkt_buf_get_skb(pkt->len);
358 if (!mypkt) {
359 brcmf_dbg(ERROR, "brcmu_pkt_buf_get_skb failed: len %d\n",
360 pkt->len);
361 return -EIO;
362 }
363
364 /* For a write, copy the buffer data into the packet. */
365 if (write)
366 memcpy(mypkt->data, pkt->data, pkt->len);
367
368 status = brcmf_sdioh_request_packet(sdiodev, fix_inc, write,
369 func, addr, mypkt);
370 303
371 /* For a read, copy the packet data back to the buffer. */ 304 pkt_len += 3;
372 if (!write) 305 pkt_len &= (uint)~3;
373 memcpy(pkt->data, mypkt->data, mypkt->len);
374 306
375 brcmu_pkt_buf_free_skb(mypkt); 307 status = brcmf_sdioh_request_data(sdiodev, write, fifo, func,
376 } else { /* case 3: We have a packet and 308 addr, pkt, pkt_len);
377 it is aligned. */ 309 if (status) {
378 brcmf_dbg(DATA, "Aligned %s Packet, direct DMA\n", 310 brcmf_dbg(ERROR, "%s FAILED %p, addr=0x%05x, pkt_len=%d, ERR=0x%08x\n",
379 write ? "Tx" : "Rx"); 311 write ? "TX" : "RX", pkt, addr, pkt_len, status);
380 status = brcmf_sdioh_request_packet(sdiodev, fix_inc, write, 312 } else {
381 func, addr, pkt); 313 brcmf_dbg(TRACE, "%s xfr'd %p, addr=0x%05x, len=%d\n",
314 write ? "TX" : "RX", pkt, addr, pkt_len);
382 } 315 }
383 316
317 /* Release host controller */
318 sdio_release_host(sdiodev->func[func]);
319
384 return status; 320 return status;
385} 321}
386 322