7fef9b5ba00364b2c65d88049e580a06288e0032
[cascardo/linux.git] / drivers / net / wireless / brcm80211 / brcmfmac / dhd_sdio.c
1 /*
2  * Copyright (c) 2010 Broadcom Corporation
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16
17 #include <linux/types.h>
18 #include <linux/kernel.h>
19 #include <linux/kthread.h>
20 #include <linux/printk.h>
21 #include <linux/pci_ids.h>
22 #include <linux/netdevice.h>
23 #include <linux/interrupt.h>
24 #include <linux/sched.h>
25 #include <linux/mmc/sdio.h>
26 #include <linux/mmc/sdio_func.h>
27 #include <linux/mmc/card.h>
28 #include <linux/semaphore.h>
29 #include <linux/firmware.h>
30 #include <linux/module.h>
31 #include <linux/bcma/bcma.h>
32 #include <linux/debugfs.h>
33 #include <linux/vmalloc.h>
34 #include <asm/unaligned.h>
35 #include <defs.h>
36 #include <brcmu_wifi.h>
37 #include <brcmu_utils.h>
38 #include <brcm_hw_ids.h>
39 #include <soc.h>
40 #include "sdio_host.h"
41 #include "sdio_chip.h"
42
43 #define DCMD_RESP_TIMEOUT  2000 /* In milli second */
44
45 #ifdef DEBUG
46
47 #define BRCMF_TRAP_INFO_SIZE    80
48
49 #define CBUF_LEN        (128)
50
51 /* Device console log buffer state */
52 #define CONSOLE_BUFFER_MAX      2024
53
54 struct rte_log_le {
55         __le32 buf;             /* Can't be pointer on (64-bit) hosts */
56         __le32 buf_size;
57         __le32 idx;
58         char *_buf_compat;      /* Redundant pointer for backward compat. */
59 };
60
61 struct rte_console {
62         /* Virtual UART
63          * When there is no UART (e.g. Quickturn),
64          * the host should write a complete
65          * input line directly into cbuf and then write
66          * the length into vcons_in.
67          * This may also be used when there is a real UART
68          * (at risk of conflicting with
69          * the real UART).  vcons_out is currently unused.
70          */
71         uint vcons_in;
72         uint vcons_out;
73
74         /* Output (logging) buffer
75          * Console output is written to a ring buffer log_buf at index log_idx.
76          * The host may read the output when it sees log_idx advance.
77          * Output will be lost if the output wraps around faster than the host
78          * polls.
79          */
80         struct rte_log_le log_le;
81
82         /* Console input line buffer
83          * Characters are read one at a time into cbuf
84          * until <CR> is received, then
85          * the buffer is processed as a command line.
86          * Also used for virtual UART.
87          */
88         uint cbuf_idx;
89         char cbuf[CBUF_LEN];
90 };
91
92 #endif                          /* DEBUG */
93 #include <chipcommon.h>
94
95 #include "dhd_bus.h"
96 #include "dhd_dbg.h"
97
98 #define TXQLEN          2048    /* bulk tx queue length */
99 #define TXHI            (TXQLEN - 256)  /* turn on flow control above TXHI */
100 #define TXLOW           (TXHI - 256)    /* turn off flow control below TXLOW */
101 #define PRIOMASK        7
102
103 #define TXRETRIES       2       /* # of retries for tx frames */
104
105 #define BRCMF_RXBOUND   50      /* Default for max rx frames in
106                                  one scheduling */
107
108 #define BRCMF_TXBOUND   20      /* Default for max tx frames in
109                                  one scheduling */
110
111 #define BRCMF_TXMINMAX  1       /* Max tx frames if rx still pending */
112
113 #define MEMBLOCK        2048    /* Block size used for downloading
114                                  of dongle image */
115 #define MAX_DATA_BUF    (32 * 1024)     /* Must be large enough to hold
116                                  biggest possible glom */
117
118 #define BRCMF_FIRSTREAD (1 << 6)
119
120
121 /* SBSDIO_DEVICE_CTL */
122
123 /* 1: device will assert busy signal when receiving CMD53 */
124 #define SBSDIO_DEVCTL_SETBUSY           0x01
125 /* 1: assertion of sdio interrupt is synchronous to the sdio clock */
126 #define SBSDIO_DEVCTL_SPI_INTR_SYNC     0x02
127 /* 1: mask all interrupts to host except the chipActive (rev 8) */
128 #define SBSDIO_DEVCTL_CA_INT_ONLY       0x04
129 /* 1: isolate internal sdio signals, put external pads in tri-state; requires
130  * sdio bus power cycle to clear (rev 9) */
131 #define SBSDIO_DEVCTL_PADS_ISO          0x08
132 /* Force SD->SB reset mapping (rev 11) */
133 #define SBSDIO_DEVCTL_SB_RST_CTL        0x30
134 /*   Determined by CoreControl bit */
135 #define SBSDIO_DEVCTL_RST_CORECTL       0x00
136 /*   Force backplane reset */
137 #define SBSDIO_DEVCTL_RST_BPRESET       0x10
138 /*   Force no backplane reset */
139 #define SBSDIO_DEVCTL_RST_NOBPRESET     0x20
140
141 /* direct(mapped) cis space */
142
143 /* MAPPED common CIS address */
144 #define SBSDIO_CIS_BASE_COMMON          0x1000
145 /* maximum bytes in one CIS */
146 #define SBSDIO_CIS_SIZE_LIMIT           0x200
147 /* cis offset addr is < 17 bits */
148 #define SBSDIO_CIS_OFT_ADDR_MASK        0x1FFFF
149
150 /* manfid tuple length, include tuple, link bytes */
151 #define SBSDIO_CIS_MANFID_TUPLE_LEN     6
152
153 /* intstatus */
154 #define I_SMB_SW0       (1 << 0)        /* To SB Mail S/W interrupt 0 */
155 #define I_SMB_SW1       (1 << 1)        /* To SB Mail S/W interrupt 1 */
156 #define I_SMB_SW2       (1 << 2)        /* To SB Mail S/W interrupt 2 */
157 #define I_SMB_SW3       (1 << 3)        /* To SB Mail S/W interrupt 3 */
158 #define I_SMB_SW_MASK   0x0000000f      /* To SB Mail S/W interrupts mask */
159 #define I_SMB_SW_SHIFT  0       /* To SB Mail S/W interrupts shift */
160 #define I_HMB_SW0       (1 << 4)        /* To Host Mail S/W interrupt 0 */
161 #define I_HMB_SW1       (1 << 5)        /* To Host Mail S/W interrupt 1 */
162 #define I_HMB_SW2       (1 << 6)        /* To Host Mail S/W interrupt 2 */
163 #define I_HMB_SW3       (1 << 7)        /* To Host Mail S/W interrupt 3 */
164 #define I_HMB_SW_MASK   0x000000f0      /* To Host Mail S/W interrupts mask */
165 #define I_HMB_SW_SHIFT  4       /* To Host Mail S/W interrupts shift */
166 #define I_WR_OOSYNC     (1 << 8)        /* Write Frame Out Of Sync */
167 #define I_RD_OOSYNC     (1 << 9)        /* Read Frame Out Of Sync */
168 #define I_PC            (1 << 10)       /* descriptor error */
169 #define I_PD            (1 << 11)       /* data error */
170 #define I_DE            (1 << 12)       /* Descriptor protocol Error */
171 #define I_RU            (1 << 13)       /* Receive descriptor Underflow */
172 #define I_RO            (1 << 14)       /* Receive fifo Overflow */
173 #define I_XU            (1 << 15)       /* Transmit fifo Underflow */
174 #define I_RI            (1 << 16)       /* Receive Interrupt */
175 #define I_BUSPWR        (1 << 17)       /* SDIO Bus Power Change (rev 9) */
176 #define I_XMTDATA_AVAIL (1 << 23)       /* bits in fifo */
177 #define I_XI            (1 << 24)       /* Transmit Interrupt */
178 #define I_RF_TERM       (1 << 25)       /* Read Frame Terminate */
179 #define I_WF_TERM       (1 << 26)       /* Write Frame Terminate */
180 #define I_PCMCIA_XU     (1 << 27)       /* PCMCIA Transmit FIFO Underflow */
181 #define I_SBINT         (1 << 28)       /* sbintstatus Interrupt */
182 #define I_CHIPACTIVE    (1 << 29)       /* chip from doze to active state */
183 #define I_SRESET        (1 << 30)       /* CCCR RES interrupt */
184 #define I_IOE2          (1U << 31)      /* CCCR IOE2 Bit Changed */
185 #define I_ERRORS        (I_PC | I_PD | I_DE | I_RU | I_RO | I_XU)
186 #define I_DMA           (I_RI | I_XI | I_ERRORS)
187
188 /* corecontrol */
189 #define CC_CISRDY               (1 << 0)        /* CIS Ready */
190 #define CC_BPRESEN              (1 << 1)        /* CCCR RES signal */
191 #define CC_F2RDY                (1 << 2)        /* set CCCR IOR2 bit */
192 #define CC_CLRPADSISO           (1 << 3)        /* clear SDIO pads isolation */
193 #define CC_XMTDATAAVAIL_MODE    (1 << 4)
194 #define CC_XMTDATAAVAIL_CTRL    (1 << 5)
195
196 /* SDA_FRAMECTRL */
197 #define SFC_RF_TERM     (1 << 0)        /* Read Frame Terminate */
198 #define SFC_WF_TERM     (1 << 1)        /* Write Frame Terminate */
199 #define SFC_CRC4WOOS    (1 << 2)        /* CRC error for write out of sync */
200 #define SFC_ABORTALL    (1 << 3)        /* Abort all in-progress frames */
201
202 /* HW frame tag */
203 #define SDPCM_FRAMETAG_LEN      4       /* 2 bytes len, 2 bytes check val */
204
205 /* Total length of frame header for dongle protocol */
206 #define SDPCM_HDRLEN    (SDPCM_FRAMETAG_LEN + SDPCM_SWHEADER_LEN)
207 #define SDPCM_RESERVE   (SDPCM_HDRLEN + BRCMF_SDALIGN)
208
209 /*
210  * Software allocation of To SB Mailbox resources
211  */
212
213 /* tosbmailbox bits corresponding to intstatus bits */
214 #define SMB_NAK         (1 << 0)        /* Frame NAK */
215 #define SMB_INT_ACK     (1 << 1)        /* Host Interrupt ACK */
216 #define SMB_USE_OOB     (1 << 2)        /* Use OOB Wakeup */
217 #define SMB_DEV_INT     (1 << 3)        /* Miscellaneous Interrupt */
218
219 /* tosbmailboxdata */
220 #define SMB_DATA_VERSION_SHIFT  16      /* host protocol version */
221
222 /*
223  * Software allocation of To Host Mailbox resources
224  */
225
226 /* intstatus bits */
227 #define I_HMB_FC_STATE  I_HMB_SW0       /* Flow Control State */
228 #define I_HMB_FC_CHANGE I_HMB_SW1       /* Flow Control State Changed */
229 #define I_HMB_FRAME_IND I_HMB_SW2       /* Frame Indication */
230 #define I_HMB_HOST_INT  I_HMB_SW3       /* Miscellaneous Interrupt */
231
232 /* tohostmailboxdata */
233 #define HMB_DATA_NAKHANDLED     1       /* retransmit NAK'd frame */
234 #define HMB_DATA_DEVREADY       2       /* talk to host after enable */
235 #define HMB_DATA_FC             4       /* per prio flowcontrol update flag */
236 #define HMB_DATA_FWREADY        8       /* fw ready for protocol activity */
237
238 #define HMB_DATA_FCDATA_MASK    0xff000000
239 #define HMB_DATA_FCDATA_SHIFT   24
240
241 #define HMB_DATA_VERSION_MASK   0x00ff0000
242 #define HMB_DATA_VERSION_SHIFT  16
243
244 /*
245  * Software-defined protocol header
246  */
247
248 /* Current protocol version */
249 #define SDPCM_PROT_VERSION      4
250
251 /* SW frame header */
252 #define SDPCM_PACKET_SEQUENCE(p)        (((u8 *)p)[0] & 0xff)
253
254 #define SDPCM_CHANNEL_MASK              0x00000f00
255 #define SDPCM_CHANNEL_SHIFT             8
256 #define SDPCM_PACKET_CHANNEL(p)         (((u8 *)p)[1] & 0x0f)
257
258 #define SDPCM_NEXTLEN_OFFSET            2
259
260 /* Data Offset from SOF (HW Tag, SW Tag, Pad) */
261 #define SDPCM_DOFFSET_OFFSET            3       /* Data Offset */
262 #define SDPCM_DOFFSET_VALUE(p)          (((u8 *)p)[SDPCM_DOFFSET_OFFSET] & 0xff)
263 #define SDPCM_DOFFSET_MASK              0xff000000
264 #define SDPCM_DOFFSET_SHIFT             24
265 #define SDPCM_FCMASK_OFFSET             4       /* Flow control */
266 #define SDPCM_FCMASK_VALUE(p)           (((u8 *)p)[SDPCM_FCMASK_OFFSET] & 0xff)
267 #define SDPCM_WINDOW_OFFSET             5       /* Credit based fc */
268 #define SDPCM_WINDOW_VALUE(p)           (((u8 *)p)[SDPCM_WINDOW_OFFSET] & 0xff)
269
270 #define SDPCM_SWHEADER_LEN      8       /* SW header is 64 bits */
271
272 /* logical channel numbers */
273 #define SDPCM_CONTROL_CHANNEL   0       /* Control channel Id */
274 #define SDPCM_EVENT_CHANNEL     1       /* Asyc Event Indication Channel Id */
275 #define SDPCM_DATA_CHANNEL      2       /* Data Xmit/Recv Channel Id */
276 #define SDPCM_GLOM_CHANNEL      3       /* For coalesced packets */
277 #define SDPCM_TEST_CHANNEL      15      /* Reserved for test/debug packets */
278
279 #define SDPCM_SEQUENCE_WRAP     256     /* wrap-around val for 8bit frame seq */
280
281 #define SDPCM_GLOMDESC(p)       (((u8 *)p)[1] & 0x80)
282
283 /*
284  * Shared structure between dongle and the host.
285  * The structure contains pointers to trap or assert information.
286  */
287 #define SDPCM_SHARED_VERSION       0x0003
288 #define SDPCM_SHARED_VERSION_MASK  0x00FF
289 #define SDPCM_SHARED_ASSERT_BUILT  0x0100
290 #define SDPCM_SHARED_ASSERT        0x0200
291 #define SDPCM_SHARED_TRAP          0x0400
292
293 /* Space for header read, limit for data packets */
294 #define MAX_HDR_READ    (1 << 6)
295 #define MAX_RX_DATASZ   2048
296
297 /* Maximum milliseconds to wait for F2 to come up */
298 #define BRCMF_WAIT_F2RDY        3000
299
300 /* Bump up limit on waiting for HT to account for first startup;
301  * if the image is doing a CRC calculation before programming the PMU
302  * for HT availability, it could take a couple hundred ms more, so
303  * max out at a 1 second (1000000us).
304  */
305 #undef PMU_MAX_TRANSITION_DLY
306 #define PMU_MAX_TRANSITION_DLY 1000000
307
308 /* Value for ChipClockCSR during initial setup */
309 #define BRCMF_INIT_CLKCTL1      (SBSDIO_FORCE_HW_CLKREQ_OFF |   \
310                                         SBSDIO_ALP_AVAIL_REQ)
311
312 /* Flags for SDH calls */
313 #define F2SYNC  (SDIO_REQ_4BYTE | SDIO_REQ_FIXED)
314
315 #define BRCMF_SDIO_FW_NAME      "brcm/brcmfmac-sdio.bin"
316 #define BRCMF_SDIO_NV_NAME      "brcm/brcmfmac-sdio.txt"
317 MODULE_FIRMWARE(BRCMF_SDIO_FW_NAME);
318 MODULE_FIRMWARE(BRCMF_SDIO_NV_NAME);
319
320 #define BRCMF_IDLE_IMMEDIATE    (-1)    /* Enter idle immediately */
321 #define BRCMF_IDLE_ACTIVE       0       /* Do not request any SD clock change
322                                          * when idle
323                                          */
324 #define BRCMF_IDLE_INTERVAL     1
325
326 /*
327  * Conversion of 802.1D priority to precedence level
328  */
329 static uint prio2prec(u32 prio)
330 {
331         return (prio == PRIO_8021D_NONE || prio == PRIO_8021D_BE) ?
332                (prio^2) : prio;
333 }
334
335 /* core registers */
336 struct sdpcmd_regs {
337         u32 corecontrol;                /* 0x00, rev8 */
338         u32 corestatus;                 /* rev8 */
339         u32 PAD[1];
340         u32 biststatus;                 /* rev8 */
341
342         /* PCMCIA access */
343         u16 pcmciamesportaladdr;        /* 0x010, rev8 */
344         u16 PAD[1];
345         u16 pcmciamesportalmask;        /* rev8 */
346         u16 PAD[1];
347         u16 pcmciawrframebc;            /* rev8 */
348         u16 PAD[1];
349         u16 pcmciaunderflowtimer;       /* rev8 */
350         u16 PAD[1];
351
352         /* interrupt */
353         u32 intstatus;                  /* 0x020, rev8 */
354         u32 hostintmask;                /* rev8 */
355         u32 intmask;                    /* rev8 */
356         u32 sbintstatus;                /* rev8 */
357         u32 sbintmask;                  /* rev8 */
358         u32 funcintmask;                /* rev4 */
359         u32 PAD[2];
360         u32 tosbmailbox;                /* 0x040, rev8 */
361         u32 tohostmailbox;              /* rev8 */
362         u32 tosbmailboxdata;            /* rev8 */
363         u32 tohostmailboxdata;          /* rev8 */
364
365         /* synchronized access to registers in SDIO clock domain */
366         u32 sdioaccess;                 /* 0x050, rev8 */
367         u32 PAD[3];
368
369         /* PCMCIA frame control */
370         u8 pcmciaframectrl;             /* 0x060, rev8 */
371         u8 PAD[3];
372         u8 pcmciawatermark;             /* rev8 */
373         u8 PAD[155];
374
375         /* interrupt batching control */
376         u32 intrcvlazy;                 /* 0x100, rev8 */
377         u32 PAD[3];
378
379         /* counters */
380         u32 cmd52rd;                    /* 0x110, rev8 */
381         u32 cmd52wr;                    /* rev8 */
382         u32 cmd53rd;                    /* rev8 */
383         u32 cmd53wr;                    /* rev8 */
384         u32 abort;                      /* rev8 */
385         u32 datacrcerror;               /* rev8 */
386         u32 rdoutofsync;                /* rev8 */
387         u32 wroutofsync;                /* rev8 */
388         u32 writebusy;                  /* rev8 */
389         u32 readwait;                   /* rev8 */
390         u32 readterm;                   /* rev8 */
391         u32 writeterm;                  /* rev8 */
392         u32 PAD[40];
393         u32 clockctlstatus;             /* rev8 */
394         u32 PAD[7];
395
396         u32 PAD[128];                   /* DMA engines */
397
398         /* SDIO/PCMCIA CIS region */
399         char cis[512];                  /* 0x400-0x5ff, rev6 */
400
401         /* PCMCIA function control registers */
402         char pcmciafcr[256];            /* 0x600-6ff, rev6 */
403         u16 PAD[55];
404
405         /* PCMCIA backplane access */
406         u16 backplanecsr;               /* 0x76E, rev6 */
407         u16 backplaneaddr0;             /* rev6 */
408         u16 backplaneaddr1;             /* rev6 */
409         u16 backplaneaddr2;             /* rev6 */
410         u16 backplaneaddr3;             /* rev6 */
411         u16 backplanedata0;             /* rev6 */
412         u16 backplanedata1;             /* rev6 */
413         u16 backplanedata2;             /* rev6 */
414         u16 backplanedata3;             /* rev6 */
415         u16 PAD[31];
416
417         /* sprom "size" & "blank" info */
418         u16 spromstatus;                /* 0x7BE, rev2 */
419         u32 PAD[464];
420
421         u16 PAD[0x80];
422 };
423
424 #ifdef DEBUG
425 /* Device console log buffer state */
426 struct brcmf_console {
427         uint count;             /* Poll interval msec counter */
428         uint log_addr;          /* Log struct address (fixed) */
429         struct rte_log_le log_le;       /* Log struct (host copy) */
430         uint bufsize;           /* Size of log buffer */
431         u8 *buf;                /* Log buffer (host copy) */
432         uint last;              /* Last buffer read index */
433 };
434
435 struct brcmf_trap_info {
436         __le32          type;
437         __le32          epc;
438         __le32          cpsr;
439         __le32          spsr;
440         __le32          r0;     /* a1 */
441         __le32          r1;     /* a2 */
442         __le32          r2;     /* a3 */
443         __le32          r3;     /* a4 */
444         __le32          r4;     /* v1 */
445         __le32          r5;     /* v2 */
446         __le32          r6;     /* v3 */
447         __le32          r7;     /* v4 */
448         __le32          r8;     /* v5 */
449         __le32          r9;     /* sb/v6 */
450         __le32          r10;    /* sl/v7 */
451         __le32          r11;    /* fp/v8 */
452         __le32          r12;    /* ip */
453         __le32          r13;    /* sp */
454         __le32          r14;    /* lr */
455         __le32          pc;     /* r15 */
456 };
457 #endif                          /* DEBUG */
458
459 struct sdpcm_shared {
460         u32 flags;
461         u32 trap_addr;
462         u32 assert_exp_addr;
463         u32 assert_file_addr;
464         u32 assert_line;
465         u32 console_addr;       /* Address of struct rte_console */
466         u32 msgtrace_addr;
467         u8 tag[32];
468         u32 brpt_addr;
469 };
470
471 struct sdpcm_shared_le {
472         __le32 flags;
473         __le32 trap_addr;
474         __le32 assert_exp_addr;
475         __le32 assert_file_addr;
476         __le32 assert_line;
477         __le32 console_addr;    /* Address of struct rte_console */
478         __le32 msgtrace_addr;
479         u8 tag[32];
480         __le32 brpt_addr;
481 };
482
483 /* SDIO read frame info */
484 struct brcmf_sdio_read {
485         u8 seq_num;
486         u8 channel;
487         u16 len;
488         u16 len_left;
489         u16 len_nxtfrm;
490         u8 dat_offset;
491 };
492
493 /* misc chip info needed by some of the routines */
494 /* Private data for SDIO bus interaction */
495 struct brcmf_sdio {
496         struct brcmf_sdio_dev *sdiodev; /* sdio device handler */
497         struct chip_info *ci;   /* Chip info struct */
498         char *vars;             /* Variables (from CIS and/or other) */
499         uint varsz;             /* Size of variables buffer */
500
501         u32 ramsize;            /* Size of RAM in SOCRAM (bytes) */
502
503         u32 hostintmask;        /* Copy of Host Interrupt Mask */
504         atomic_t intstatus;     /* Intstatus bits (events) pending */
505         atomic_t fcstate;       /* State of dongle flow-control */
506
507         uint blocksize;         /* Block size of SDIO transfers */
508         uint roundup;           /* Max roundup limit */
509
510         struct pktq txq;        /* Queue length used for flow-control */
511         u8 flowcontrol; /* per prio flow control bitmask */
512         u8 tx_seq;              /* Transmit sequence number (next) */
513         u8 tx_max;              /* Maximum transmit sequence allowed */
514
515         u8 hdrbuf[MAX_HDR_READ + BRCMF_SDALIGN];
516         u8 *rxhdr;              /* Header of current rx frame (in hdrbuf) */
517         u8 rx_seq;              /* Receive sequence number (expected) */
518         struct brcmf_sdio_read cur_read;
519                                 /* info of current read frame */
520         bool rxskip;            /* Skip receive (awaiting NAK ACK) */
521         bool rxpending;         /* Data frame pending in dongle */
522
523         uint rxbound;           /* Rx frames to read before resched */
524         uint txbound;           /* Tx frames to send before resched */
525         uint txminmax;
526
527         struct sk_buff *glomd;  /* Packet containing glomming descriptor */
528         struct sk_buff_head glom; /* Packet list for glommed superframe */
529         uint glomerr;           /* Glom packet read errors */
530
531         u8 *rxbuf;              /* Buffer for receiving control packets */
532         uint rxblen;            /* Allocated length of rxbuf */
533         u8 *rxctl;              /* Aligned pointer into rxbuf */
534         u8 *rxctl_orig;         /* pointer for freeing rxctl */
535         u8 *databuf;            /* Buffer for receiving big glom packet */
536         u8 *dataptr;            /* Aligned pointer into databuf */
537         uint rxlen;             /* Length of valid data in buffer */
538         spinlock_t rxctl_lock;  /* protection lock for ctrl frame resources */
539
540         u8 sdpcm_ver;   /* Bus protocol reported by dongle */
541
542         bool intr;              /* Use interrupts */
543         bool poll;              /* Use polling */
544         atomic_t ipend;         /* Device interrupt is pending */
545         uint spurious;          /* Count of spurious interrupts */
546         uint pollrate;          /* Ticks between device polls */
547         uint polltick;          /* Tick counter */
548
549 #ifdef DEBUG
550         uint console_interval;
551         struct brcmf_console console;   /* Console output polling support */
552         uint console_addr;      /* Console address from shared struct */
553 #endif                          /* DEBUG */
554
555         uint clkstate;          /* State of sd and backplane clock(s) */
556         bool activity;          /* Activity flag for clock down */
557         s32 idletime;           /* Control for activity timeout */
558         s32 idlecount;  /* Activity timeout counter */
559         s32 idleclock;  /* How to set bus driver when idle */
560         s32 sd_rxchain;
561         bool use_rxchain;       /* If brcmf should use PKT chains */
562         bool rxflow_mode;       /* Rx flow control mode */
563         bool rxflow;            /* Is rx flow control on */
564         bool alp_only;          /* Don't use HT clock (ALP only) */
565
566         u8 *ctrl_frame_buf;
567         u32 ctrl_frame_len;
568         bool ctrl_frame_stat;
569
570         spinlock_t txqlock;
571         wait_queue_head_t ctrl_wait;
572         wait_queue_head_t dcmd_resp_wait;
573
574         struct timer_list timer;
575         struct completion watchdog_wait;
576         struct task_struct *watchdog_tsk;
577         bool wd_timer_valid;
578         uint save_ms;
579
580         struct workqueue_struct *brcmf_wq;
581         struct work_struct datawork;
582         struct list_head dpc_tsklst;
583         spinlock_t dpc_tl_lock;
584
585         const struct firmware *firmware;
586         u32 fw_ptr;
587
588         bool txoff;             /* Transmit flow-controlled */
589         struct brcmf_sdio_count sdcnt;
590 };
591
592 /* clkstate */
593 #define CLK_NONE        0
594 #define CLK_SDONLY      1
595 #define CLK_PENDING     2       /* Not used yet */
596 #define CLK_AVAIL       3
597
598 #ifdef DEBUG
599 static int qcount[NUMPRIO];
600 static int tx_packets[NUMPRIO];
601 #endif                          /* DEBUG */
602
603 #define SDIO_DRIVE_STRENGTH     6       /* in milliamps */
604
605 #define RETRYCHAN(chan) ((chan) == SDPCM_EVENT_CHANNEL)
606
607 /* Retry count for register access failures */
608 static const uint retry_limit = 2;
609
610 /* Limit on rounding up frames */
611 static const uint max_roundup = 512;
612
613 #define ALIGNMENT  4
614
615 enum brcmf_sdio_frmtype {
616         BRCMF_SDIO_FT_NORMAL,
617         BRCMF_SDIO_FT_SUPER,
618         BRCMF_SDIO_FT_SUB,
619 };
620
621 static void pkt_align(struct sk_buff *p, int len, int align)
622 {
623         uint datalign;
624         datalign = (unsigned long)(p->data);
625         datalign = roundup(datalign, (align)) - datalign;
626         if (datalign)
627                 skb_pull(p, datalign);
628         __skb_trim(p, len);
629 }
630
631 /* To check if there's window offered */
632 static bool data_ok(struct brcmf_sdio *bus)
633 {
634         return (u8)(bus->tx_max - bus->tx_seq) != 0 &&
635                ((u8)(bus->tx_max - bus->tx_seq) & 0x80) == 0;
636 }
637
638 /*
639  * Reads a register in the SDIO hardware block. This block occupies a series of
640  * adresses on the 32 bit backplane bus.
641  */
642 static int
643 r_sdreg32(struct brcmf_sdio *bus, u32 *regvar, u32 offset)
644 {
645         u8 idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV);
646         int ret;
647
648         *regvar = brcmf_sdio_regrl(bus->sdiodev,
649                                    bus->ci->c_inf[idx].base + offset, &ret);
650
651         return ret;
652 }
653
654 static int
655 w_sdreg32(struct brcmf_sdio *bus, u32 regval, u32 reg_offset)
656 {
657         u8 idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV);
658         int ret;
659
660         brcmf_sdio_regwl(bus->sdiodev,
661                          bus->ci->c_inf[idx].base + reg_offset,
662                          regval, &ret);
663
664         return ret;
665 }
666
667 #define PKT_AVAILABLE()         (intstatus & I_HMB_FRAME_IND)
668
669 #define HOSTINTMASK             (I_HMB_SW_MASK | I_CHIPACTIVE)
670
671 /* Turn backplane clock on or off */
672 static int brcmf_sdbrcm_htclk(struct brcmf_sdio *bus, bool on, bool pendok)
673 {
674         int err;
675         u8 clkctl, clkreq, devctl;
676         unsigned long timeout;
677
678         brcmf_dbg(TRACE, "Enter\n");
679
680         clkctl = 0;
681
682         if (on) {
683                 /* Request HT Avail */
684                 clkreq =
685                     bus->alp_only ? SBSDIO_ALP_AVAIL_REQ : SBSDIO_HT_AVAIL_REQ;
686
687                 brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
688                                  clkreq, &err);
689                 if (err) {
690                         brcmf_err("HT Avail request error: %d\n", err);
691                         return -EBADE;
692                 }
693
694                 /* Check current status */
695                 clkctl = brcmf_sdio_regrb(bus->sdiodev,
696                                           SBSDIO_FUNC1_CHIPCLKCSR, &err);
697                 if (err) {
698                         brcmf_err("HT Avail read error: %d\n", err);
699                         return -EBADE;
700                 }
701
702                 /* Go to pending and await interrupt if appropriate */
703                 if (!SBSDIO_CLKAV(clkctl, bus->alp_only) && pendok) {
704                         /* Allow only clock-available interrupt */
705                         devctl = brcmf_sdio_regrb(bus->sdiodev,
706                                                   SBSDIO_DEVICE_CTL, &err);
707                         if (err) {
708                                 brcmf_err("Devctl error setting CA: %d\n",
709                                           err);
710                                 return -EBADE;
711                         }
712
713                         devctl |= SBSDIO_DEVCTL_CA_INT_ONLY;
714                         brcmf_sdio_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL,
715                                          devctl, &err);
716                         brcmf_dbg(INFO, "CLKCTL: set PENDING\n");
717                         bus->clkstate = CLK_PENDING;
718
719                         return 0;
720                 } else if (bus->clkstate == CLK_PENDING) {
721                         /* Cancel CA-only interrupt filter */
722                         devctl = brcmf_sdio_regrb(bus->sdiodev,
723                                                   SBSDIO_DEVICE_CTL, &err);
724                         devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY;
725                         brcmf_sdio_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL,
726                                          devctl, &err);
727                 }
728
729                 /* Otherwise, wait here (polling) for HT Avail */
730                 timeout = jiffies +
731                           msecs_to_jiffies(PMU_MAX_TRANSITION_DLY/1000);
732                 while (!SBSDIO_CLKAV(clkctl, bus->alp_only)) {
733                         clkctl = brcmf_sdio_regrb(bus->sdiodev,
734                                                   SBSDIO_FUNC1_CHIPCLKCSR,
735                                                   &err);
736                         if (time_after(jiffies, timeout))
737                                 break;
738                         else
739                                 usleep_range(5000, 10000);
740                 }
741                 if (err) {
742                         brcmf_err("HT Avail request error: %d\n", err);
743                         return -EBADE;
744                 }
745                 if (!SBSDIO_CLKAV(clkctl, bus->alp_only)) {
746                         brcmf_err("HT Avail timeout (%d): clkctl 0x%02x\n",
747                                   PMU_MAX_TRANSITION_DLY, clkctl);
748                         return -EBADE;
749                 }
750
751                 /* Mark clock available */
752                 bus->clkstate = CLK_AVAIL;
753                 brcmf_dbg(INFO, "CLKCTL: turned ON\n");
754
755 #if defined(DEBUG)
756                 if (!bus->alp_only) {
757                         if (SBSDIO_ALPONLY(clkctl))
758                                 brcmf_err("HT Clock should be on\n");
759                 }
760 #endif                          /* defined (DEBUG) */
761
762                 bus->activity = true;
763         } else {
764                 clkreq = 0;
765
766                 if (bus->clkstate == CLK_PENDING) {
767                         /* Cancel CA-only interrupt filter */
768                         devctl = brcmf_sdio_regrb(bus->sdiodev,
769                                                   SBSDIO_DEVICE_CTL, &err);
770                         devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY;
771                         brcmf_sdio_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL,
772                                          devctl, &err);
773                 }
774
775                 bus->clkstate = CLK_SDONLY;
776                 brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
777                                  clkreq, &err);
778                 brcmf_dbg(INFO, "CLKCTL: turned OFF\n");
779                 if (err) {
780                         brcmf_err("Failed access turning clock off: %d\n",
781                                   err);
782                         return -EBADE;
783                 }
784         }
785         return 0;
786 }
787
788 /* Change idle/active SD state */
789 static int brcmf_sdbrcm_sdclk(struct brcmf_sdio *bus, bool on)
790 {
791         brcmf_dbg(TRACE, "Enter\n");
792
793         if (on)
794                 bus->clkstate = CLK_SDONLY;
795         else
796                 bus->clkstate = CLK_NONE;
797
798         return 0;
799 }
800
801 /* Transition SD and backplane clock readiness */
802 static int brcmf_sdbrcm_clkctl(struct brcmf_sdio *bus, uint target, bool pendok)
803 {
804 #ifdef DEBUG
805         uint oldstate = bus->clkstate;
806 #endif                          /* DEBUG */
807
808         brcmf_dbg(TRACE, "Enter\n");
809
810         /* Early exit if we're already there */
811         if (bus->clkstate == target) {
812                 if (target == CLK_AVAIL) {
813                         brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS);
814                         bus->activity = true;
815                 }
816                 return 0;
817         }
818
819         switch (target) {
820         case CLK_AVAIL:
821                 /* Make sure SD clock is available */
822                 if (bus->clkstate == CLK_NONE)
823                         brcmf_sdbrcm_sdclk(bus, true);
824                 /* Now request HT Avail on the backplane */
825                 brcmf_sdbrcm_htclk(bus, true, pendok);
826                 brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS);
827                 bus->activity = true;
828                 break;
829
830         case CLK_SDONLY:
831                 /* Remove HT request, or bring up SD clock */
832                 if (bus->clkstate == CLK_NONE)
833                         brcmf_sdbrcm_sdclk(bus, true);
834                 else if (bus->clkstate == CLK_AVAIL)
835                         brcmf_sdbrcm_htclk(bus, false, false);
836                 else
837                         brcmf_err("request for %d -> %d\n",
838                                   bus->clkstate, target);
839                 brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS);
840                 break;
841
842         case CLK_NONE:
843                 /* Make sure to remove HT request */
844                 if (bus->clkstate == CLK_AVAIL)
845                         brcmf_sdbrcm_htclk(bus, false, false);
846                 /* Now remove the SD clock */
847                 brcmf_sdbrcm_sdclk(bus, false);
848                 brcmf_sdbrcm_wd_timer(bus, 0);
849                 break;
850         }
851 #ifdef DEBUG
852         brcmf_dbg(INFO, "%d -> %d\n", oldstate, bus->clkstate);
853 #endif                          /* DEBUG */
854
855         return 0;
856 }
857
858 static u32 brcmf_sdbrcm_hostmail(struct brcmf_sdio *bus)
859 {
860         u32 intstatus = 0;
861         u32 hmb_data;
862         u8 fcbits;
863         int ret;
864
865         brcmf_dbg(TRACE, "Enter\n");
866
867         /* Read mailbox data and ack that we did so */
868         ret = r_sdreg32(bus, &hmb_data,
869                         offsetof(struct sdpcmd_regs, tohostmailboxdata));
870
871         if (ret == 0)
872                 w_sdreg32(bus, SMB_INT_ACK,
873                           offsetof(struct sdpcmd_regs, tosbmailbox));
874         bus->sdcnt.f1regdata += 2;
875
876         /* Dongle recomposed rx frames, accept them again */
877         if (hmb_data & HMB_DATA_NAKHANDLED) {
878                 brcmf_dbg(INFO, "Dongle reports NAK handled, expect rtx of %d\n",
879                           bus->rx_seq);
880                 if (!bus->rxskip)
881                         brcmf_err("unexpected NAKHANDLED!\n");
882
883                 bus->rxskip = false;
884                 intstatus |= I_HMB_FRAME_IND;
885         }
886
887         /*
888          * DEVREADY does not occur with gSPI.
889          */
890         if (hmb_data & (HMB_DATA_DEVREADY | HMB_DATA_FWREADY)) {
891                 bus->sdpcm_ver =
892                     (hmb_data & HMB_DATA_VERSION_MASK) >>
893                     HMB_DATA_VERSION_SHIFT;
894                 if (bus->sdpcm_ver != SDPCM_PROT_VERSION)
895                         brcmf_err("Version mismatch, dongle reports %d, "
896                                   "expecting %d\n",
897                                   bus->sdpcm_ver, SDPCM_PROT_VERSION);
898                 else
899                         brcmf_dbg(INFO, "Dongle ready, protocol version %d\n",
900                                   bus->sdpcm_ver);
901         }
902
903         /*
904          * Flow Control has been moved into the RX headers and this out of band
905          * method isn't used any more.
906          * remaining backward compatible with older dongles.
907          */
908         if (hmb_data & HMB_DATA_FC) {
909                 fcbits = (hmb_data & HMB_DATA_FCDATA_MASK) >>
910                                                         HMB_DATA_FCDATA_SHIFT;
911
912                 if (fcbits & ~bus->flowcontrol)
913                         bus->sdcnt.fc_xoff++;
914
915                 if (bus->flowcontrol & ~fcbits)
916                         bus->sdcnt.fc_xon++;
917
918                 bus->sdcnt.fc_rcvd++;
919                 bus->flowcontrol = fcbits;
920         }
921
922         /* Shouldn't be any others */
923         if (hmb_data & ~(HMB_DATA_DEVREADY |
924                          HMB_DATA_NAKHANDLED |
925                          HMB_DATA_FC |
926                          HMB_DATA_FWREADY |
927                          HMB_DATA_FCDATA_MASK | HMB_DATA_VERSION_MASK))
928                 brcmf_err("Unknown mailbox data content: 0x%02x\n",
929                           hmb_data);
930
931         return intstatus;
932 }
933
934 static void brcmf_sdbrcm_rxfail(struct brcmf_sdio *bus, bool abort, bool rtx)
935 {
936         uint retries = 0;
937         u16 lastrbc;
938         u8 hi, lo;
939         int err;
940
941         brcmf_err("%sterminate frame%s\n",
942                   abort ? "abort command, " : "",
943                   rtx ? ", send NAK" : "");
944
945         if (abort)
946                 brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2);
947
948         brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL,
949                          SFC_RF_TERM, &err);
950         bus->sdcnt.f1regdata++;
951
952         /* Wait until the packet has been flushed (device/FIFO stable) */
953         for (lastrbc = retries = 0xffff; retries > 0; retries--) {
954                 hi = brcmf_sdio_regrb(bus->sdiodev,
955                                       SBSDIO_FUNC1_RFRAMEBCHI, &err);
956                 lo = brcmf_sdio_regrb(bus->sdiodev,
957                                       SBSDIO_FUNC1_RFRAMEBCLO, &err);
958                 bus->sdcnt.f1regdata += 2;
959
960                 if ((hi == 0) && (lo == 0))
961                         break;
962
963                 if ((hi > (lastrbc >> 8)) && (lo > (lastrbc & 0x00ff))) {
964                         brcmf_err("count growing: last 0x%04x now 0x%04x\n",
965                                   lastrbc, (hi << 8) + lo);
966                 }
967                 lastrbc = (hi << 8) + lo;
968         }
969
970         if (!retries)
971                 brcmf_err("count never zeroed: last 0x%04x\n", lastrbc);
972         else
973                 brcmf_dbg(INFO, "flush took %d iterations\n", 0xffff - retries);
974
975         if (rtx) {
976                 bus->sdcnt.rxrtx++;
977                 err = w_sdreg32(bus, SMB_NAK,
978                                 offsetof(struct sdpcmd_regs, tosbmailbox));
979
980                 bus->sdcnt.f1regdata++;
981                 if (err == 0)
982                         bus->rxskip = true;
983         }
984
985         /* Clear partial in any case */
986         bus->cur_read.len = 0;
987
988         /* If we can't reach the device, signal failure */
989         if (err)
990                 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
991 }
992
993 /* copy a buffer into a pkt buffer chain */
994 static uint brcmf_sdbrcm_glom_from_buf(struct brcmf_sdio *bus, uint len)
995 {
996         uint n, ret = 0;
997         struct sk_buff *p;
998         u8 *buf;
999
1000         buf = bus->dataptr;
1001
1002         /* copy the data */
1003         skb_queue_walk(&bus->glom, p) {
1004                 n = min_t(uint, p->len, len);
1005                 memcpy(p->data, buf, n);
1006                 buf += n;
1007                 len -= n;
1008                 ret += n;
1009                 if (!len)
1010                         break;
1011         }
1012
1013         return ret;
1014 }
1015
1016 /* return total length of buffer chain */
1017 static uint brcmf_sdbrcm_glom_len(struct brcmf_sdio *bus)
1018 {
1019         struct sk_buff *p;
1020         uint total;
1021
1022         total = 0;
1023         skb_queue_walk(&bus->glom, p)
1024                 total += p->len;
1025         return total;
1026 }
1027
1028 static void brcmf_sdbrcm_free_glom(struct brcmf_sdio *bus)
1029 {
1030         struct sk_buff *cur, *next;
1031
1032         skb_queue_walk_safe(&bus->glom, cur, next) {
1033                 skb_unlink(cur, &bus->glom);
1034                 brcmu_pkt_buf_free_skb(cur);
1035         }
1036 }
1037
1038 static int brcmf_sdio_hdparser(struct brcmf_sdio *bus, u8 *header,
1039                                struct brcmf_sdio_read *rd,
1040                                enum brcmf_sdio_frmtype type)
1041 {
1042         u16 len, checksum;
1043         u8 rx_seq, fc, tx_seq_max;
1044
1045         /*
1046          * 4 bytes hardware header (frame tag)
1047          * Byte 0~1: Frame length
1048          * Byte 2~3: Checksum, bit-wise inverse of frame length
1049          */
1050         len = get_unaligned_le16(header);
1051         checksum = get_unaligned_le16(header + sizeof(u16));
1052         /* All zero means no more to read */
1053         if (!(len | checksum)) {
1054                 bus->rxpending = false;
1055                 return -ENODATA;
1056         }
1057         if ((u16)(~(len ^ checksum))) {
1058                 brcmf_err("HW header checksum error\n");
1059                 bus->sdcnt.rx_badhdr++;
1060                 brcmf_sdbrcm_rxfail(bus, false, false);
1061                 return -EIO;
1062         }
1063         if (len < SDPCM_HDRLEN) {
1064                 brcmf_err("HW header length error\n");
1065                 return -EPROTO;
1066         }
1067         if (type == BRCMF_SDIO_FT_SUPER &&
1068             (roundup(len, bus->blocksize) != rd->len)) {
1069                 brcmf_err("HW superframe header length error\n");
1070                 return -EPROTO;
1071         }
1072         if (type == BRCMF_SDIO_FT_SUB && len > rd->len) {
1073                 brcmf_err("HW subframe header length error\n");
1074                 return -EPROTO;
1075         }
1076         rd->len = len;
1077
1078         /*
1079          * 8 bytes hardware header
1080          * Byte 0: Rx sequence number
1081          * Byte 1: 4 MSB Channel number, 4 LSB arbitrary flag
1082          * Byte 2: Length of next data frame
1083          * Byte 3: Data offset
1084          * Byte 4: Flow control bits
1085          * Byte 5: Maximum Sequence number allow for Tx
1086          * Byte 6~7: Reserved
1087          */
1088         if (type == BRCMF_SDIO_FT_SUPER &&
1089             SDPCM_GLOMDESC(&header[SDPCM_FRAMETAG_LEN])) {
1090                 brcmf_err("Glom descriptor found in superframe head\n");
1091                 rd->len = 0;
1092                 return -EINVAL;
1093         }
1094         rx_seq = SDPCM_PACKET_SEQUENCE(&header[SDPCM_FRAMETAG_LEN]);
1095         rd->channel = SDPCM_PACKET_CHANNEL(&header[SDPCM_FRAMETAG_LEN]);
1096         if (len > MAX_RX_DATASZ && rd->channel != SDPCM_CONTROL_CHANNEL &&
1097             type != BRCMF_SDIO_FT_SUPER) {
1098                 brcmf_err("HW header length too long\n");
1099                 bus->sdiodev->bus_if->dstats.rx_errors++;
1100                 bus->sdcnt.rx_toolong++;
1101                 brcmf_sdbrcm_rxfail(bus, false, false);
1102                 rd->len = 0;
1103                 return -EPROTO;
1104         }
1105         if (type == BRCMF_SDIO_FT_SUPER && rd->channel != SDPCM_GLOM_CHANNEL) {
1106                 brcmf_err("Wrong channel for superframe\n");
1107                 rd->len = 0;
1108                 return -EINVAL;
1109         }
1110         if (type == BRCMF_SDIO_FT_SUB && rd->channel != SDPCM_DATA_CHANNEL &&
1111             rd->channel != SDPCM_EVENT_CHANNEL) {
1112                 brcmf_err("Wrong channel for subframe\n");
1113                 rd->len = 0;
1114                 return -EINVAL;
1115         }
1116         rd->dat_offset = SDPCM_DOFFSET_VALUE(&header[SDPCM_FRAMETAG_LEN]);
1117         if (rd->dat_offset < SDPCM_HDRLEN || rd->dat_offset > rd->len) {
1118                 brcmf_err("seq %d: bad data offset\n", rx_seq);
1119                 bus->sdcnt.rx_badhdr++;
1120                 brcmf_sdbrcm_rxfail(bus, false, false);
1121                 rd->len = 0;
1122                 return -ENXIO;
1123         }
1124         if (rd->seq_num != rx_seq) {
1125                 brcmf_err("seq %d: sequence number error, expect %d\n",
1126                           rx_seq, rd->seq_num);
1127                 bus->sdcnt.rx_badseq++;
1128                 rd->seq_num = rx_seq;
1129         }
1130         /* no need to check the reset for subframe */
1131         if (type == BRCMF_SDIO_FT_SUB)
1132                 return 0;
1133         rd->len_nxtfrm = header[SDPCM_FRAMETAG_LEN + SDPCM_NEXTLEN_OFFSET];
1134         if (rd->len_nxtfrm << 4 > MAX_RX_DATASZ) {
1135                 /* only warm for NON glom packet */
1136                 if (rd->channel != SDPCM_GLOM_CHANNEL)
1137                         brcmf_err("seq %d: next length error\n", rx_seq);
1138                 rd->len_nxtfrm = 0;
1139         }
1140         fc = SDPCM_FCMASK_VALUE(&header[SDPCM_FRAMETAG_LEN]);
1141         if (bus->flowcontrol != fc) {
1142                 if (~bus->flowcontrol & fc)
1143                         bus->sdcnt.fc_xoff++;
1144                 if (bus->flowcontrol & ~fc)
1145                         bus->sdcnt.fc_xon++;
1146                 bus->sdcnt.fc_rcvd++;
1147                 bus->flowcontrol = fc;
1148         }
1149         tx_seq_max = SDPCM_WINDOW_VALUE(&header[SDPCM_FRAMETAG_LEN]);
1150         if ((u8)(tx_seq_max - bus->tx_seq) > 0x40) {
1151                 brcmf_err("seq %d: max tx seq number error\n", rx_seq);
1152                 tx_seq_max = bus->tx_seq + 2;
1153         }
1154         bus->tx_max = tx_seq_max;
1155
1156         return 0;
1157 }
1158
1159 static u8 brcmf_sdbrcm_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1160 {
1161         u16 dlen, totlen;
1162         u8 *dptr, num = 0;
1163
1164         u16 sublen;
1165         struct sk_buff *pfirst, *pnext;
1166
1167         int errcode;
1168         u8 doff, sfdoff;
1169
1170         bool usechain = bus->use_rxchain;
1171
1172         struct brcmf_sdio_read rd_new;
1173
1174         /* If packets, issue read(s) and send up packet chain */
1175         /* Return sequence numbers consumed? */
1176
1177         brcmf_dbg(TRACE, "start: glomd %p glom %p\n",
1178                   bus->glomd, skb_peek(&bus->glom));
1179
1180         /* If there's a descriptor, generate the packet chain */
1181         if (bus->glomd) {
1182                 pfirst = pnext = NULL;
1183                 dlen = (u16) (bus->glomd->len);
1184                 dptr = bus->glomd->data;
1185                 if (!dlen || (dlen & 1)) {
1186                         brcmf_err("bad glomd len(%d), ignore descriptor\n",
1187                                   dlen);
1188                         dlen = 0;
1189                 }
1190
1191                 for (totlen = num = 0; dlen; num++) {
1192                         /* Get (and move past) next length */
1193                         sublen = get_unaligned_le16(dptr);
1194                         dlen -= sizeof(u16);
1195                         dptr += sizeof(u16);
1196                         if ((sublen < SDPCM_HDRLEN) ||
1197                             ((num == 0) && (sublen < (2 * SDPCM_HDRLEN)))) {
1198                                 brcmf_err("descriptor len %d bad: %d\n",
1199                                           num, sublen);
1200                                 pnext = NULL;
1201                                 break;
1202                         }
1203                         if (sublen % BRCMF_SDALIGN) {
1204                                 brcmf_err("sublen %d not multiple of %d\n",
1205                                           sublen, BRCMF_SDALIGN);
1206                                 usechain = false;
1207                         }
1208                         totlen += sublen;
1209
1210                         /* For last frame, adjust read len so total
1211                                  is a block multiple */
1212                         if (!dlen) {
1213                                 sublen +=
1214                                     (roundup(totlen, bus->blocksize) - totlen);
1215                                 totlen = roundup(totlen, bus->blocksize);
1216                         }
1217
1218                         /* Allocate/chain packet for next subframe */
1219                         pnext = brcmu_pkt_buf_get_skb(sublen + BRCMF_SDALIGN);
1220                         if (pnext == NULL) {
1221                                 brcmf_err("bcm_pkt_buf_get_skb failed, num %d len %d\n",
1222                                           num, sublen);
1223                                 break;
1224                         }
1225                         skb_queue_tail(&bus->glom, pnext);
1226
1227                         /* Adhere to start alignment requirements */
1228                         pkt_align(pnext, sublen, BRCMF_SDALIGN);
1229                 }
1230
1231                 /* If all allocations succeeded, save packet chain
1232                          in bus structure */
1233                 if (pnext) {
1234                         brcmf_dbg(GLOM, "allocated %d-byte packet chain for %d subframes\n",
1235                                   totlen, num);
1236                         if (BRCMF_GLOM_ON() && bus->cur_read.len &&
1237                             totlen != bus->cur_read.len) {
1238                                 brcmf_dbg(GLOM, "glomdesc mismatch: nextlen %d glomdesc %d rxseq %d\n",
1239                                           bus->cur_read.len, totlen, rxseq);
1240                         }
1241                         pfirst = pnext = NULL;
1242                 } else {
1243                         brcmf_sdbrcm_free_glom(bus);
1244                         num = 0;
1245                 }
1246
1247                 /* Done with descriptor packet */
1248                 brcmu_pkt_buf_free_skb(bus->glomd);
1249                 bus->glomd = NULL;
1250                 bus->cur_read.len = 0;
1251         }
1252
1253         /* Ok -- either we just generated a packet chain,
1254                  or had one from before */
1255         if (!skb_queue_empty(&bus->glom)) {
1256                 if (BRCMF_GLOM_ON()) {
1257                         brcmf_dbg(GLOM, "try superframe read, packet chain:\n");
1258                         skb_queue_walk(&bus->glom, pnext) {
1259                                 brcmf_dbg(GLOM, "    %p: %p len 0x%04x (%d)\n",
1260                                           pnext, (u8 *) (pnext->data),
1261                                           pnext->len, pnext->len);
1262                         }
1263                 }
1264
1265                 pfirst = skb_peek(&bus->glom);
1266                 dlen = (u16) brcmf_sdbrcm_glom_len(bus);
1267
1268                 /* Do an SDIO read for the superframe.  Configurable iovar to
1269                  * read directly into the chained packet, or allocate a large
1270                  * packet and and copy into the chain.
1271                  */
1272                 sdio_claim_host(bus->sdiodev->func[1]);
1273                 if (usechain) {
1274                         errcode = brcmf_sdcard_recv_chain(bus->sdiodev,
1275                                         bus->sdiodev->sbwad,
1276                                         SDIO_FUNC_2, F2SYNC, &bus->glom);
1277                 } else if (bus->dataptr) {
1278                         errcode = brcmf_sdcard_recv_buf(bus->sdiodev,
1279                                         bus->sdiodev->sbwad,
1280                                         SDIO_FUNC_2, F2SYNC,
1281                                         bus->dataptr, dlen);
1282                         sublen = (u16) brcmf_sdbrcm_glom_from_buf(bus, dlen);
1283                         if (sublen != dlen) {
1284                                 brcmf_err("FAILED TO COPY, dlen %d sublen %d\n",
1285                                           dlen, sublen);
1286                                 errcode = -1;
1287                         }
1288                         pnext = NULL;
1289                 } else {
1290                         brcmf_err("COULDN'T ALLOC %d-BYTE GLOM, FORCE FAILURE\n",
1291                                   dlen);
1292                         errcode = -1;
1293                 }
1294                 sdio_release_host(bus->sdiodev->func[1]);
1295                 bus->sdcnt.f2rxdata++;
1296
1297                 /* On failure, kill the superframe, allow a couple retries */
1298                 if (errcode < 0) {
1299                         brcmf_err("glom read of %d bytes failed: %d\n",
1300                                   dlen, errcode);
1301                         bus->sdiodev->bus_if->dstats.rx_errors++;
1302
1303                         sdio_claim_host(bus->sdiodev->func[1]);
1304                         if (bus->glomerr++ < 3) {
1305                                 brcmf_sdbrcm_rxfail(bus, true, true);
1306                         } else {
1307                                 bus->glomerr = 0;
1308                                 brcmf_sdbrcm_rxfail(bus, true, false);
1309                                 bus->sdcnt.rxglomfail++;
1310                                 brcmf_sdbrcm_free_glom(bus);
1311                         }
1312                         sdio_release_host(bus->sdiodev->func[1]);
1313                         return 0;
1314                 }
1315
1316                 brcmf_dbg_hex_dump(BRCMF_GLOM_ON(),
1317                                    pfirst->data, min_t(int, pfirst->len, 48),
1318                                    "SUPERFRAME:\n");
1319
1320                 rd_new.seq_num = rxseq;
1321                 rd_new.len = dlen;
1322                 sdio_claim_host(bus->sdiodev->func[1]);
1323                 errcode = brcmf_sdio_hdparser(bus, pfirst->data, &rd_new,
1324                                               BRCMF_SDIO_FT_SUPER);
1325                 sdio_release_host(bus->sdiodev->func[1]);
1326                 bus->cur_read.len = rd_new.len_nxtfrm << 4;
1327
1328                 /* Remove superframe header, remember offset */
1329                 skb_pull(pfirst, rd_new.dat_offset);
1330                 sfdoff = rd_new.dat_offset;
1331                 num = 0;
1332
1333                 /* Validate all the subframe headers */
1334                 skb_queue_walk(&bus->glom, pnext) {
1335                         /* leave when invalid subframe is found */
1336                         if (errcode)
1337                                 break;
1338
1339                         rd_new.len = pnext->len;
1340                         rd_new.seq_num = rxseq++;
1341                         sdio_claim_host(bus->sdiodev->func[1]);
1342                         errcode = brcmf_sdio_hdparser(bus, pnext->data, &rd_new,
1343                                                       BRCMF_SDIO_FT_SUB);
1344                         sdio_release_host(bus->sdiodev->func[1]);
1345                         brcmf_dbg_hex_dump(BRCMF_GLOM_ON(),
1346                                            pnext->data, 32, "subframe:\n");
1347
1348                         num++;
1349                 }
1350
1351                 if (errcode) {
1352                         /* Terminate frame on error, request
1353                                  a couple retries */
1354                         sdio_claim_host(bus->sdiodev->func[1]);
1355                         if (bus->glomerr++ < 3) {
1356                                 /* Restore superframe header space */
1357                                 skb_push(pfirst, sfdoff);
1358                                 brcmf_sdbrcm_rxfail(bus, true, true);
1359                         } else {
1360                                 bus->glomerr = 0;
1361                                 brcmf_sdbrcm_rxfail(bus, true, false);
1362                                 bus->sdcnt.rxglomfail++;
1363                                 brcmf_sdbrcm_free_glom(bus);
1364                         }
1365                         sdio_release_host(bus->sdiodev->func[1]);
1366                         bus->cur_read.len = 0;
1367                         return 0;
1368                 }
1369
1370                 /* Basic SD framing looks ok - process each packet (header) */
1371
1372                 skb_queue_walk_safe(&bus->glom, pfirst, pnext) {
1373                         dptr = (u8 *) (pfirst->data);
1374                         sublen = get_unaligned_le16(dptr);
1375                         doff = SDPCM_DOFFSET_VALUE(&dptr[SDPCM_FRAMETAG_LEN]);
1376
1377                         brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_DATA_ON(),
1378                                            dptr, pfirst->len,
1379                                            "Rx Subframe Data:\n");
1380
1381                         __skb_trim(pfirst, sublen);
1382                         skb_pull(pfirst, doff);
1383
1384                         if (pfirst->len == 0) {
1385                                 skb_unlink(pfirst, &bus->glom);
1386                                 brcmu_pkt_buf_free_skb(pfirst);
1387                                 continue;
1388                         }
1389
1390                         brcmf_dbg_hex_dump(BRCMF_GLOM_ON(),
1391                                            pfirst->data,
1392                                            min_t(int, pfirst->len, 32),
1393                                            "subframe %d to stack, %p (%p/%d) nxt/lnk %p/%p\n",
1394                                            bus->glom.qlen, pfirst, pfirst->data,
1395                                            pfirst->len, pfirst->next,
1396                                            pfirst->prev);
1397                 }
1398                 /* sent any remaining packets up */
1399                 if (bus->glom.qlen)
1400                         brcmf_rx_frames(bus->sdiodev->dev, &bus->glom);
1401
1402                 bus->sdcnt.rxglomframes++;
1403                 bus->sdcnt.rxglompkts += bus->glom.qlen;
1404         }
1405         return num;
1406 }
1407
1408 static int brcmf_sdbrcm_dcmd_resp_wait(struct brcmf_sdio *bus, uint *condition,
1409                                         bool *pending)
1410 {
1411         DECLARE_WAITQUEUE(wait, current);
1412         int timeout = msecs_to_jiffies(DCMD_RESP_TIMEOUT);
1413
1414         /* Wait until control frame is available */
1415         add_wait_queue(&bus->dcmd_resp_wait, &wait);
1416         set_current_state(TASK_INTERRUPTIBLE);
1417
1418         while (!(*condition) && (!signal_pending(current) && timeout))
1419                 timeout = schedule_timeout(timeout);
1420
1421         if (signal_pending(current))
1422                 *pending = true;
1423
1424         set_current_state(TASK_RUNNING);
1425         remove_wait_queue(&bus->dcmd_resp_wait, &wait);
1426
1427         return timeout;
1428 }
1429
1430 static int brcmf_sdbrcm_dcmd_resp_wake(struct brcmf_sdio *bus)
1431 {
1432         if (waitqueue_active(&bus->dcmd_resp_wait))
1433                 wake_up_interruptible(&bus->dcmd_resp_wait);
1434
1435         return 0;
1436 }
1437 static void
1438 brcmf_sdbrcm_read_control(struct brcmf_sdio *bus, u8 *hdr, uint len, uint doff)
1439 {
1440         uint rdlen, pad;
1441         u8 *buf = NULL, *rbuf;
1442         int sdret;
1443
1444         brcmf_dbg(TRACE, "Enter\n");
1445
1446         if (bus->rxblen)
1447                 buf = vzalloc(bus->rxblen);
1448         if (!buf) {
1449                 brcmf_err("no memory for control frame\n");
1450                 goto done;
1451         }
1452         rbuf = bus->rxbuf;
1453         pad = ((unsigned long)rbuf % BRCMF_SDALIGN);
1454         if (pad)
1455                 rbuf += (BRCMF_SDALIGN - pad);
1456
1457         /* Copy the already-read portion over */
1458         memcpy(buf, hdr, BRCMF_FIRSTREAD);
1459         if (len <= BRCMF_FIRSTREAD)
1460                 goto gotpkt;
1461
1462         /* Raise rdlen to next SDIO block to avoid tail command */
1463         rdlen = len - BRCMF_FIRSTREAD;
1464         if (bus->roundup && bus->blocksize && (rdlen > bus->blocksize)) {
1465                 pad = bus->blocksize - (rdlen % bus->blocksize);
1466                 if ((pad <= bus->roundup) && (pad < bus->blocksize) &&
1467                     ((len + pad) < bus->sdiodev->bus_if->maxctl))
1468                         rdlen += pad;
1469         } else if (rdlen % BRCMF_SDALIGN) {
1470                 rdlen += BRCMF_SDALIGN - (rdlen % BRCMF_SDALIGN);
1471         }
1472
1473         /* Satisfy length-alignment requirements */
1474         if (rdlen & (ALIGNMENT - 1))
1475                 rdlen = roundup(rdlen, ALIGNMENT);
1476
1477         /* Drop if the read is too big or it exceeds our maximum */
1478         if ((rdlen + BRCMF_FIRSTREAD) > bus->sdiodev->bus_if->maxctl) {
1479                 brcmf_err("%d-byte control read exceeds %d-byte buffer\n",
1480                           rdlen, bus->sdiodev->bus_if->maxctl);
1481                 bus->sdiodev->bus_if->dstats.rx_errors++;
1482                 brcmf_sdbrcm_rxfail(bus, false, false);
1483                 goto done;
1484         }
1485
1486         if ((len - doff) > bus->sdiodev->bus_if->maxctl) {
1487                 brcmf_err("%d-byte ctl frame (%d-byte ctl data) exceeds %d-byte limit\n",
1488                           len, len - doff, bus->sdiodev->bus_if->maxctl);
1489                 bus->sdiodev->bus_if->dstats.rx_errors++;
1490                 bus->sdcnt.rx_toolong++;
1491                 brcmf_sdbrcm_rxfail(bus, false, false);
1492                 goto done;
1493         }
1494
1495         /* Read remain of frame body */
1496         sdret = brcmf_sdcard_recv_buf(bus->sdiodev,
1497                                 bus->sdiodev->sbwad,
1498                                 SDIO_FUNC_2,
1499                                 F2SYNC, rbuf, rdlen);
1500         bus->sdcnt.f2rxdata++;
1501
1502         /* Control frame failures need retransmission */
1503         if (sdret < 0) {
1504                 brcmf_err("read %d control bytes failed: %d\n",
1505                           rdlen, sdret);
1506                 bus->sdcnt.rxc_errors++;
1507                 brcmf_sdbrcm_rxfail(bus, true, true);
1508                 goto done;
1509         } else
1510                 memcpy(buf + BRCMF_FIRSTREAD, rbuf, rdlen);
1511
1512 gotpkt:
1513
1514         brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_CTL_ON(),
1515                            buf, len, "RxCtrl:\n");
1516
1517         /* Point to valid data and indicate its length */
1518         spin_lock_bh(&bus->rxctl_lock);
1519         if (bus->rxctl) {
1520                 brcmf_err("last control frame is being processed.\n");
1521                 spin_unlock_bh(&bus->rxctl_lock);
1522                 vfree(buf);
1523                 goto done;
1524         }
1525         bus->rxctl = buf + doff;
1526         bus->rxctl_orig = buf;
1527         bus->rxlen = len - doff;
1528         spin_unlock_bh(&bus->rxctl_lock);
1529
1530 done:
1531         /* Awake any waiters */
1532         brcmf_sdbrcm_dcmd_resp_wake(bus);
1533 }
1534
1535 /* Pad read to blocksize for efficiency */
1536 static void brcmf_pad(struct brcmf_sdio *bus, u16 *pad, u16 *rdlen)
1537 {
1538         if (bus->roundup && bus->blocksize && *rdlen > bus->blocksize) {
1539                 *pad = bus->blocksize - (*rdlen % bus->blocksize);
1540                 if (*pad <= bus->roundup && *pad < bus->blocksize &&
1541                     *rdlen + *pad + BRCMF_FIRSTREAD < MAX_RX_DATASZ)
1542                         *rdlen += *pad;
1543         } else if (*rdlen % BRCMF_SDALIGN) {
1544                 *rdlen += BRCMF_SDALIGN - (*rdlen % BRCMF_SDALIGN);
1545         }
1546 }
1547
1548 static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
1549 {
1550         struct sk_buff *pkt;            /* Packet for event or data frames */
1551         struct sk_buff_head pktlist;    /* needed for bus interface */
1552         u16 pad;                /* Number of pad bytes to read */
1553         uint rxleft = 0;        /* Remaining number of frames allowed */
1554         int sdret;              /* Return code from calls */
1555         uint rxcount = 0;       /* Total frames read */
1556         struct brcmf_sdio_read *rd = &bus->cur_read, rd_new;
1557         u8 head_read = 0;
1558
1559         brcmf_dbg(TRACE, "Enter\n");
1560
1561         /* Not finished unless we encounter no more frames indication */
1562         bus->rxpending = true;
1563
1564         for (rd->seq_num = bus->rx_seq, rxleft = maxframes;
1565              !bus->rxskip && rxleft &&
1566              bus->sdiodev->bus_if->state != BRCMF_BUS_DOWN;
1567              rd->seq_num++, rxleft--) {
1568
1569                 /* Handle glomming separately */
1570                 if (bus->glomd || !skb_queue_empty(&bus->glom)) {
1571                         u8 cnt;
1572                         brcmf_dbg(GLOM, "calling rxglom: glomd %p, glom %p\n",
1573                                   bus->glomd, skb_peek(&bus->glom));
1574                         cnt = brcmf_sdbrcm_rxglom(bus, rd->seq_num);
1575                         brcmf_dbg(GLOM, "rxglom returned %d\n", cnt);
1576                         rd->seq_num += cnt - 1;
1577                         rxleft = (rxleft > cnt) ? (rxleft - cnt) : 1;
1578                         continue;
1579                 }
1580
1581                 rd->len_left = rd->len;
1582                 /* read header first for unknow frame length */
1583                 sdio_claim_host(bus->sdiodev->func[1]);
1584                 if (!rd->len) {
1585                         sdret = brcmf_sdcard_recv_buf(bus->sdiodev,
1586                                                       bus->sdiodev->sbwad,
1587                                                       SDIO_FUNC_2, F2SYNC,
1588                                                       bus->rxhdr,
1589                                                       BRCMF_FIRSTREAD);
1590                         bus->sdcnt.f2rxhdrs++;
1591                         if (sdret < 0) {
1592                                 brcmf_err("RXHEADER FAILED: %d\n",
1593                                           sdret);
1594                                 bus->sdcnt.rx_hdrfail++;
1595                                 brcmf_sdbrcm_rxfail(bus, true, true);
1596                                 sdio_release_host(bus->sdiodev->func[1]);
1597                                 continue;
1598                         }
1599
1600                         brcmf_dbg_hex_dump(BRCMF_BYTES_ON() || BRCMF_HDRS_ON(),
1601                                            bus->rxhdr, SDPCM_HDRLEN,
1602                                            "RxHdr:\n");
1603
1604                         if (brcmf_sdio_hdparser(bus, bus->rxhdr, rd,
1605                                                 BRCMF_SDIO_FT_NORMAL)) {
1606                                 sdio_release_host(bus->sdiodev->func[1]);
1607                                 if (!bus->rxpending)
1608                                         break;
1609                                 else
1610                                         continue;
1611                         }
1612
1613                         if (rd->channel == SDPCM_CONTROL_CHANNEL) {
1614                                 brcmf_sdbrcm_read_control(bus, bus->rxhdr,
1615                                                           rd->len,
1616                                                           rd->dat_offset);
1617                                 /* prepare the descriptor for the next read */
1618                                 rd->len = rd->len_nxtfrm << 4;
1619                                 rd->len_nxtfrm = 0;
1620                                 /* treat all packet as event if we don't know */
1621                                 rd->channel = SDPCM_EVENT_CHANNEL;
1622                                 sdio_release_host(bus->sdiodev->func[1]);
1623                                 continue;
1624                         }
1625                         rd->len_left = rd->len > BRCMF_FIRSTREAD ?
1626                                        rd->len - BRCMF_FIRSTREAD : 0;
1627                         head_read = BRCMF_FIRSTREAD;
1628                 }
1629
1630                 brcmf_pad(bus, &pad, &rd->len_left);
1631
1632                 pkt = brcmu_pkt_buf_get_skb(rd->len_left + head_read +
1633                                             BRCMF_SDALIGN);
1634                 if (!pkt) {
1635                         /* Give up on data, request rtx of events */
1636                         brcmf_err("brcmu_pkt_buf_get_skb failed\n");
1637                         bus->sdiodev->bus_if->dstats.rx_dropped++;
1638                         brcmf_sdbrcm_rxfail(bus, false,
1639                                             RETRYCHAN(rd->channel));
1640                         sdio_release_host(bus->sdiodev->func[1]);
1641                         continue;
1642                 }
1643                 skb_pull(pkt, head_read);
1644                 pkt_align(pkt, rd->len_left, BRCMF_SDALIGN);
1645
1646                 sdret = brcmf_sdcard_recv_pkt(bus->sdiodev, bus->sdiodev->sbwad,
1647                                               SDIO_FUNC_2, F2SYNC, pkt);
1648                 bus->sdcnt.f2rxdata++;
1649                 sdio_release_host(bus->sdiodev->func[1]);
1650
1651                 if (sdret < 0) {
1652                         brcmf_err("read %d bytes from channel %d failed: %d\n",
1653                                   rd->len, rd->channel, sdret);
1654                         brcmu_pkt_buf_free_skb(pkt);
1655                         bus->sdiodev->bus_if->dstats.rx_errors++;
1656                         sdio_claim_host(bus->sdiodev->func[1]);
1657                         brcmf_sdbrcm_rxfail(bus, true,
1658                                             RETRYCHAN(rd->channel));
1659                         sdio_release_host(bus->sdiodev->func[1]);
1660                         continue;
1661                 }
1662
1663                 if (head_read) {
1664                         skb_push(pkt, head_read);
1665                         memcpy(pkt->data, bus->rxhdr, head_read);
1666                         head_read = 0;
1667                 } else {
1668                         memcpy(bus->rxhdr, pkt->data, SDPCM_HDRLEN);
1669                         rd_new.seq_num = rd->seq_num;
1670                         sdio_claim_host(bus->sdiodev->func[1]);
1671                         if (brcmf_sdio_hdparser(bus, bus->rxhdr, &rd_new,
1672                                                 BRCMF_SDIO_FT_NORMAL)) {
1673                                 rd->len = 0;
1674                                 brcmu_pkt_buf_free_skb(pkt);
1675                         }
1676                         bus->sdcnt.rx_readahead_cnt++;
1677                         if (rd->len != roundup(rd_new.len, 16)) {
1678                                 brcmf_err("frame length mismatch:read %d, should be %d\n",
1679                                           rd->len,
1680                                           roundup(rd_new.len, 16) >> 4);
1681                                 rd->len = 0;
1682                                 brcmf_sdbrcm_rxfail(bus, true, true);
1683                                 sdio_release_host(bus->sdiodev->func[1]);
1684                                 brcmu_pkt_buf_free_skb(pkt);
1685                                 continue;
1686                         }
1687                         sdio_release_host(bus->sdiodev->func[1]);
1688                         rd->len_nxtfrm = rd_new.len_nxtfrm;
1689                         rd->channel = rd_new.channel;
1690                         rd->dat_offset = rd_new.dat_offset;
1691
1692                         brcmf_dbg_hex_dump(!(BRCMF_BYTES_ON() &&
1693                                              BRCMF_DATA_ON()) &&
1694                                            BRCMF_HDRS_ON(),
1695                                            bus->rxhdr, SDPCM_HDRLEN,
1696                                            "RxHdr:\n");
1697
1698                         if (rd_new.channel == SDPCM_CONTROL_CHANNEL) {
1699                                 brcmf_err("readahead on control packet %d?\n",
1700                                           rd_new.seq_num);
1701                                 /* Force retry w/normal header read */
1702                                 rd->len = 0;
1703                                 sdio_claim_host(bus->sdiodev->func[1]);
1704                                 brcmf_sdbrcm_rxfail(bus, false, true);
1705                                 sdio_release_host(bus->sdiodev->func[1]);
1706                                 brcmu_pkt_buf_free_skb(pkt);
1707                                 continue;
1708                         }
1709                 }
1710
1711                 brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_DATA_ON(),
1712                                    pkt->data, rd->len, "Rx Data:\n");
1713
1714                 /* Save superframe descriptor and allocate packet frame */
1715                 if (rd->channel == SDPCM_GLOM_CHANNEL) {
1716                         if (SDPCM_GLOMDESC(&bus->rxhdr[SDPCM_FRAMETAG_LEN])) {
1717                                 brcmf_dbg(GLOM, "glom descriptor, %d bytes:\n",
1718                                           rd->len);
1719                                 brcmf_dbg_hex_dump(BRCMF_GLOM_ON(),
1720                                                    pkt->data, rd->len,
1721                                                    "Glom Data:\n");
1722                                 __skb_trim(pkt, rd->len);
1723                                 skb_pull(pkt, SDPCM_HDRLEN);
1724                                 bus->glomd = pkt;
1725                         } else {
1726                                 brcmf_err("%s: glom superframe w/o "
1727                                           "descriptor!\n", __func__);
1728                                 sdio_claim_host(bus->sdiodev->func[1]);
1729                                 brcmf_sdbrcm_rxfail(bus, false, false);
1730                                 sdio_release_host(bus->sdiodev->func[1]);
1731                         }
1732                         /* prepare the descriptor for the next read */
1733                         rd->len = rd->len_nxtfrm << 4;
1734                         rd->len_nxtfrm = 0;
1735                         /* treat all packet as event if we don't know */
1736                         rd->channel = SDPCM_EVENT_CHANNEL;
1737                         continue;
1738                 }
1739
1740                 /* Fill in packet len and prio, deliver upward */
1741                 __skb_trim(pkt, rd->len);
1742                 skb_pull(pkt, rd->dat_offset);
1743
1744                 /* prepare the descriptor for the next read */
1745                 rd->len = rd->len_nxtfrm << 4;
1746                 rd->len_nxtfrm = 0;
1747                 /* treat all packet as event if we don't know */
1748                 rd->channel = SDPCM_EVENT_CHANNEL;
1749
1750                 if (pkt->len == 0) {
1751                         brcmu_pkt_buf_free_skb(pkt);
1752                         continue;
1753                 }
1754
1755                 skb_queue_head_init(&pktlist);
1756                 skb_queue_tail(&pktlist, pkt);
1757                 brcmf_rx_frames(bus->sdiodev->dev, &pktlist);
1758         }
1759
1760         rxcount = maxframes - rxleft;
1761         /* Message if we hit the limit */
1762         if (!rxleft)
1763                 brcmf_dbg(DATA, "hit rx limit of %d frames\n", maxframes);
1764         else
1765                 brcmf_dbg(DATA, "processed %d frames\n", rxcount);
1766         /* Back off rxseq if awaiting rtx, update rx_seq */
1767         if (bus->rxskip)
1768                 rd->seq_num--;
1769         bus->rx_seq = rd->seq_num;
1770
1771         return rxcount;
1772 }
1773
1774 static void
1775 brcmf_sdbrcm_wait_event_wakeup(struct brcmf_sdio *bus)
1776 {
1777         if (waitqueue_active(&bus->ctrl_wait))
1778                 wake_up_interruptible(&bus->ctrl_wait);
1779         return;
1780 }
1781
1782 /* Writes a HW/SW header into the packet and sends it. */
1783 /* Assumes: (a) header space already there, (b) caller holds lock */
1784 static int brcmf_sdbrcm_txpkt(struct brcmf_sdio *bus, struct sk_buff *pkt,
1785                               uint chan, bool free_pkt)
1786 {
1787         int ret;
1788         u8 *frame;
1789         u16 len, pad = 0;
1790         u32 swheader;
1791         struct sk_buff *new;
1792         int i;
1793
1794         brcmf_dbg(TRACE, "Enter\n");
1795
1796         frame = (u8 *) (pkt->data);
1797
1798         /* Add alignment padding, allocate new packet if needed */
1799         pad = ((unsigned long)frame % BRCMF_SDALIGN);
1800         if (pad) {
1801                 if (skb_headroom(pkt) < pad) {
1802                         brcmf_dbg(INFO, "insufficient headroom %d for %d pad\n",
1803                                   skb_headroom(pkt), pad);
1804                         bus->sdiodev->bus_if->tx_realloc++;
1805                         new = brcmu_pkt_buf_get_skb(pkt->len + BRCMF_SDALIGN);
1806                         if (!new) {
1807                                 brcmf_err("couldn't allocate new %d-byte packet\n",
1808                                           pkt->len + BRCMF_SDALIGN);
1809                                 ret = -ENOMEM;
1810                                 goto done;
1811                         }
1812
1813                         pkt_align(new, pkt->len, BRCMF_SDALIGN);
1814                         memcpy(new->data, pkt->data, pkt->len);
1815                         if (free_pkt)
1816                                 brcmu_pkt_buf_free_skb(pkt);
1817                         /* free the pkt if canned one is not used */
1818                         free_pkt = true;
1819                         pkt = new;
1820                         frame = (u8 *) (pkt->data);
1821                         /* precondition: (frame % BRCMF_SDALIGN) == 0) */
1822                         pad = 0;
1823                 } else {
1824                         skb_push(pkt, pad);
1825                         frame = (u8 *) (pkt->data);
1826                         /* precondition: pad + SDPCM_HDRLEN <= pkt->len */
1827                         memset(frame, 0, pad + SDPCM_HDRLEN);
1828                 }
1829         }
1830         /* precondition: pad < BRCMF_SDALIGN */
1831
1832         /* Hardware tag: 2 byte len followed by 2 byte ~len check (all LE) */
1833         len = (u16) (pkt->len);
1834         *(__le16 *) frame = cpu_to_le16(len);
1835         *(((__le16 *) frame) + 1) = cpu_to_le16(~len);
1836
1837         /* Software tag: channel, sequence number, data offset */
1838         swheader =
1839             ((chan << SDPCM_CHANNEL_SHIFT) & SDPCM_CHANNEL_MASK) | bus->tx_seq |
1840             (((pad +
1841                SDPCM_HDRLEN) << SDPCM_DOFFSET_SHIFT) & SDPCM_DOFFSET_MASK);
1842
1843         put_unaligned_le32(swheader, frame + SDPCM_FRAMETAG_LEN);
1844         put_unaligned_le32(0, frame + SDPCM_FRAMETAG_LEN + sizeof(swheader));
1845
1846 #ifdef DEBUG
1847         tx_packets[pkt->priority]++;
1848 #endif
1849
1850         brcmf_dbg_hex_dump(BRCMF_BYTES_ON() &&
1851                            ((BRCMF_CTL_ON() && chan == SDPCM_CONTROL_CHANNEL) ||
1852                             (BRCMF_DATA_ON() && chan != SDPCM_CONTROL_CHANNEL)),
1853                            frame, len, "Tx Frame:\n");
1854         brcmf_dbg_hex_dump(!(BRCMF_BYTES_ON() &&
1855                              ((BRCMF_CTL_ON() &&
1856                                chan == SDPCM_CONTROL_CHANNEL) ||
1857                               (BRCMF_DATA_ON() &&
1858                                chan != SDPCM_CONTROL_CHANNEL))) &&
1859                            BRCMF_HDRS_ON(),
1860                            frame, min_t(u16, len, 16), "TxHdr:\n");
1861
1862         /* Raise len to next SDIO block to eliminate tail command */
1863         if (bus->roundup && bus->blocksize && (len > bus->blocksize)) {
1864                 u16 pad = bus->blocksize - (len % bus->blocksize);
1865                 if ((pad <= bus->roundup) && (pad < bus->blocksize))
1866                                 len += pad;
1867         } else if (len % BRCMF_SDALIGN) {
1868                 len += BRCMF_SDALIGN - (len % BRCMF_SDALIGN);
1869         }
1870
1871         /* Some controllers have trouble with odd bytes -- round to even */
1872         if (len & (ALIGNMENT - 1))
1873                         len = roundup(len, ALIGNMENT);
1874
1875         sdio_claim_host(bus->sdiodev->func[1]);
1876         ret = brcmf_sdcard_send_pkt(bus->sdiodev, bus->sdiodev->sbwad,
1877                                     SDIO_FUNC_2, F2SYNC, pkt);
1878         bus->sdcnt.f2txdata++;
1879
1880         if (ret < 0) {
1881                 /* On failure, abort the command and terminate the frame */
1882                 brcmf_dbg(INFO, "sdio error %d, abort command and terminate frame\n",
1883                           ret);
1884                 bus->sdcnt.tx_sderrs++;
1885
1886                 brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2);
1887                 brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL,
1888                                  SFC_WF_TERM, NULL);
1889                 bus->sdcnt.f1regdata++;
1890
1891                 for (i = 0; i < 3; i++) {
1892                         u8 hi, lo;
1893                         hi = brcmf_sdio_regrb(bus->sdiodev,
1894                                               SBSDIO_FUNC1_WFRAMEBCHI, NULL);
1895                         lo = brcmf_sdio_regrb(bus->sdiodev,
1896                                               SBSDIO_FUNC1_WFRAMEBCLO, NULL);
1897                         bus->sdcnt.f1regdata += 2;
1898                         if ((hi == 0) && (lo == 0))
1899                                 break;
1900                 }
1901
1902         }
1903         sdio_release_host(bus->sdiodev->func[1]);
1904         if (ret == 0)
1905                 bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP;
1906
1907 done:
1908         /* restore pkt buffer pointer before calling tx complete routine */
1909         skb_pull(pkt, SDPCM_HDRLEN + pad);
1910         brcmf_txcomplete(bus->sdiodev->dev, pkt, ret != 0);
1911
1912         if (free_pkt)
1913                 brcmu_pkt_buf_free_skb(pkt);
1914
1915         return ret;
1916 }
1917
1918 static uint brcmf_sdbrcm_sendfromq(struct brcmf_sdio *bus, uint maxframes)
1919 {
1920         struct sk_buff *pkt;
1921         u32 intstatus = 0;
1922         int ret = 0, prec_out;
1923         uint cnt = 0;
1924         uint datalen;
1925         u8 tx_prec_map;
1926
1927         brcmf_dbg(TRACE, "Enter\n");
1928
1929         tx_prec_map = ~bus->flowcontrol;
1930
1931         /* Send frames until the limit or some other event */
1932         for (cnt = 0; (cnt < maxframes) && data_ok(bus); cnt++) {
1933                 spin_lock_bh(&bus->txqlock);
1934                 pkt = brcmu_pktq_mdeq(&bus->txq, tx_prec_map, &prec_out);
1935                 if (pkt == NULL) {
1936                         spin_unlock_bh(&bus->txqlock);
1937                         break;
1938                 }
1939                 spin_unlock_bh(&bus->txqlock);
1940                 datalen = pkt->len - SDPCM_HDRLEN;
1941
1942                 ret = brcmf_sdbrcm_txpkt(bus, pkt, SDPCM_DATA_CHANNEL, true);
1943                 if (ret)
1944                         bus->sdiodev->bus_if->dstats.tx_errors++;
1945                 else
1946                         bus->sdiodev->bus_if->dstats.tx_bytes += datalen;
1947
1948                 /* In poll mode, need to check for other events */
1949                 if (!bus->intr && cnt) {
1950                         /* Check device status, signal pending interrupt */
1951                         sdio_claim_host(bus->sdiodev->func[1]);
1952                         ret = r_sdreg32(bus, &intstatus,
1953                                         offsetof(struct sdpcmd_regs,
1954                                                  intstatus));
1955                         sdio_release_host(bus->sdiodev->func[1]);
1956                         bus->sdcnt.f2txdata++;
1957                         if (ret != 0)
1958                                 break;
1959                         if (intstatus & bus->hostintmask)
1960                                 atomic_set(&bus->ipend, 1);
1961                 }
1962         }
1963
1964         /* Deflow-control stack if needed */
1965         if (bus->sdiodev->bus_if->drvr_up &&
1966             (bus->sdiodev->bus_if->state == BRCMF_BUS_DATA) &&
1967             bus->txoff && (pktq_len(&bus->txq) < TXLOW)) {
1968                 bus->txoff = false;
1969                 brcmf_txflowblock(bus->sdiodev->dev, false);
1970         }
1971
1972         return cnt;
1973 }
1974
1975 static void brcmf_sdbrcm_bus_stop(struct device *dev)
1976 {
1977         u32 local_hostintmask;
1978         u8 saveclk;
1979         int err;
1980         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
1981         struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
1982         struct brcmf_sdio *bus = sdiodev->bus;
1983
1984         brcmf_dbg(TRACE, "Enter\n");
1985
1986         if (bus->watchdog_tsk) {
1987                 send_sig(SIGTERM, bus->watchdog_tsk, 1);
1988                 kthread_stop(bus->watchdog_tsk);
1989                 bus->watchdog_tsk = NULL;
1990         }
1991
1992         sdio_claim_host(bus->sdiodev->func[1]);
1993
1994         /* Enable clock for device interrupts */
1995         brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false);
1996
1997         /* Disable and clear interrupts at the chip level also */
1998         w_sdreg32(bus, 0, offsetof(struct sdpcmd_regs, hostintmask));
1999         local_hostintmask = bus->hostintmask;
2000         bus->hostintmask = 0;
2001
2002         /* Change our idea of bus state */
2003         bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2004
2005         /* Force clocks on backplane to be sure F2 interrupt propagates */
2006         saveclk = brcmf_sdio_regrb(bus->sdiodev,
2007                                    SBSDIO_FUNC1_CHIPCLKCSR, &err);
2008         if (!err) {
2009                 brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
2010                                  (saveclk | SBSDIO_FORCE_HT), &err);
2011         }
2012         if (err)
2013                 brcmf_err("Failed to force clock for F2: err %d\n", err);
2014
2015         /* Turn off the bus (F2), free any pending packets */
2016         brcmf_dbg(INTR, "disable SDIO interrupts\n");
2017         brcmf_sdio_regwb(bus->sdiodev, SDIO_CCCR_IOEx, SDIO_FUNC_ENABLE_1,
2018                          NULL);
2019
2020         /* Clear any pending interrupts now that F2 is disabled */
2021         w_sdreg32(bus, local_hostintmask,
2022                   offsetof(struct sdpcmd_regs, intstatus));
2023
2024         /* Turn off the backplane clock (only) */
2025         brcmf_sdbrcm_clkctl(bus, CLK_SDONLY, false);
2026         sdio_release_host(bus->sdiodev->func[1]);
2027
2028         /* Clear the data packet queues */
2029         brcmu_pktq_flush(&bus->txq, true, NULL, NULL);
2030
2031         /* Clear any held glomming stuff */
2032         if (bus->glomd)
2033                 brcmu_pkt_buf_free_skb(bus->glomd);
2034         brcmf_sdbrcm_free_glom(bus);
2035
2036         /* Clear rx control and wake any waiters */
2037         spin_lock_bh(&bus->rxctl_lock);
2038         bus->rxlen = 0;
2039         spin_unlock_bh(&bus->rxctl_lock);
2040         brcmf_sdbrcm_dcmd_resp_wake(bus);
2041
2042         /* Reset some F2 state stuff */
2043         bus->rxskip = false;
2044         bus->tx_seq = bus->rx_seq = 0;
2045 }
2046
2047 #ifdef CONFIG_BRCMFMAC_SDIO_OOB
2048 static inline void brcmf_sdbrcm_clrintr(struct brcmf_sdio *bus)
2049 {
2050         unsigned long flags;
2051
2052         spin_lock_irqsave(&bus->sdiodev->irq_en_lock, flags);
2053         if (!bus->sdiodev->irq_en && !atomic_read(&bus->ipend)) {
2054                 enable_irq(bus->sdiodev->irq);
2055                 bus->sdiodev->irq_en = true;
2056         }
2057         spin_unlock_irqrestore(&bus->sdiodev->irq_en_lock, flags);
2058 }
2059 #else
2060 static inline void brcmf_sdbrcm_clrintr(struct brcmf_sdio *bus)
2061 {
2062 }
2063 #endif          /* CONFIG_BRCMFMAC_SDIO_OOB */
2064
2065 static inline void brcmf_sdbrcm_adddpctsk(struct brcmf_sdio *bus)
2066 {
2067         struct list_head *new_hd;
2068         unsigned long flags;
2069
2070         if (in_interrupt())
2071                 new_hd = kzalloc(sizeof(struct list_head), GFP_ATOMIC);
2072         else
2073                 new_hd = kzalloc(sizeof(struct list_head), GFP_KERNEL);
2074         if (new_hd == NULL)
2075                 return;
2076
2077         spin_lock_irqsave(&bus->dpc_tl_lock, flags);
2078         list_add_tail(new_hd, &bus->dpc_tsklst);
2079         spin_unlock_irqrestore(&bus->dpc_tl_lock, flags);
2080 }
2081
2082 static int brcmf_sdio_intr_rstatus(struct brcmf_sdio *bus)
2083 {
2084         u8 idx;
2085         u32 addr;
2086         unsigned long val;
2087         int n, ret;
2088
2089         idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV);
2090         addr = bus->ci->c_inf[idx].base +
2091                offsetof(struct sdpcmd_regs, intstatus);
2092
2093         ret = brcmf_sdio_regrw_helper(bus->sdiodev, addr, &val, false);
2094         bus->sdcnt.f1regdata++;
2095         if (ret != 0)
2096                 val = 0;
2097
2098         val &= bus->hostintmask;
2099         atomic_set(&bus->fcstate, !!(val & I_HMB_FC_STATE));
2100
2101         /* Clear interrupts */
2102         if (val) {
2103                 ret = brcmf_sdio_regrw_helper(bus->sdiodev, addr, &val, true);
2104                 bus->sdcnt.f1regdata++;
2105         }
2106
2107         if (ret) {
2108                 atomic_set(&bus->intstatus, 0);
2109         } else if (val) {
2110                 for_each_set_bit(n, &val, 32)
2111                         set_bit(n, (unsigned long *)&bus->intstatus.counter);
2112         }
2113
2114         return ret;
2115 }
2116
2117 static void brcmf_sdbrcm_dpc(struct brcmf_sdio *bus)
2118 {
2119         u32 newstatus = 0;
2120         unsigned long intstatus;
2121         uint rxlimit = bus->rxbound;    /* Rx frames to read before resched */
2122         uint txlimit = bus->txbound;    /* Tx frames to send before resched */
2123         uint framecnt = 0;      /* Temporary counter of tx/rx frames */
2124         int err = 0, n;
2125
2126         brcmf_dbg(TRACE, "Enter\n");
2127
2128         sdio_claim_host(bus->sdiodev->func[1]);
2129
2130         /* If waiting for HTAVAIL, check status */
2131         if (bus->clkstate == CLK_PENDING) {
2132                 u8 clkctl, devctl = 0;
2133
2134 #ifdef DEBUG
2135                 /* Check for inconsistent device control */
2136                 devctl = brcmf_sdio_regrb(bus->sdiodev,
2137                                           SBSDIO_DEVICE_CTL, &err);
2138                 if (err) {
2139                         brcmf_err("error reading DEVCTL: %d\n", err);
2140                         bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2141                 }
2142 #endif                          /* DEBUG */
2143
2144                 /* Read CSR, if clock on switch to AVAIL, else ignore */
2145                 clkctl = brcmf_sdio_regrb(bus->sdiodev,
2146                                           SBSDIO_FUNC1_CHIPCLKCSR, &err);
2147                 if (err) {
2148                         brcmf_err("error reading CSR: %d\n",
2149                                   err);
2150                         bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2151                 }
2152
2153                 brcmf_dbg(INFO, "DPC: PENDING, devctl 0x%02x clkctl 0x%02x\n",
2154                           devctl, clkctl);
2155
2156                 if (SBSDIO_HTAV(clkctl)) {
2157                         devctl = brcmf_sdio_regrb(bus->sdiodev,
2158                                                   SBSDIO_DEVICE_CTL, &err);
2159                         if (err) {
2160                                 brcmf_err("error reading DEVCTL: %d\n",
2161                                           err);
2162                                 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2163                         }
2164                         devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY;
2165                         brcmf_sdio_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL,
2166                                          devctl, &err);
2167                         if (err) {
2168                                 brcmf_err("error writing DEVCTL: %d\n",
2169                                           err);
2170                                 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2171                         }
2172                         bus->clkstate = CLK_AVAIL;
2173                 }
2174         }
2175
2176         /* Make sure backplane clock is on */
2177         brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, true);
2178
2179         /* Pending interrupt indicates new device status */
2180         if (atomic_read(&bus->ipend) > 0) {
2181                 atomic_set(&bus->ipend, 0);
2182                 err = brcmf_sdio_intr_rstatus(bus);
2183         }
2184
2185         /* Start with leftover status bits */
2186         intstatus = atomic_xchg(&bus->intstatus, 0);
2187
2188         /* Handle flow-control change: read new state in case our ack
2189          * crossed another change interrupt.  If change still set, assume
2190          * FC ON for safety, let next loop through do the debounce.
2191          */
2192         if (intstatus & I_HMB_FC_CHANGE) {
2193                 intstatus &= ~I_HMB_FC_CHANGE;
2194                 err = w_sdreg32(bus, I_HMB_FC_CHANGE,
2195                                 offsetof(struct sdpcmd_regs, intstatus));
2196
2197                 err = r_sdreg32(bus, &newstatus,
2198                                 offsetof(struct sdpcmd_regs, intstatus));
2199                 bus->sdcnt.f1regdata += 2;
2200                 atomic_set(&bus->fcstate,
2201                            !!(newstatus & (I_HMB_FC_STATE | I_HMB_FC_CHANGE)));
2202                 intstatus |= (newstatus & bus->hostintmask);
2203         }
2204
2205         /* Handle host mailbox indication */
2206         if (intstatus & I_HMB_HOST_INT) {
2207                 intstatus &= ~I_HMB_HOST_INT;
2208                 intstatus |= brcmf_sdbrcm_hostmail(bus);
2209         }
2210
2211         sdio_release_host(bus->sdiodev->func[1]);
2212
2213         /* Generally don't ask for these, can get CRC errors... */
2214         if (intstatus & I_WR_OOSYNC) {
2215                 brcmf_err("Dongle reports WR_OOSYNC\n");
2216                 intstatus &= ~I_WR_OOSYNC;
2217         }
2218
2219         if (intstatus & I_RD_OOSYNC) {
2220                 brcmf_err("Dongle reports RD_OOSYNC\n");
2221                 intstatus &= ~I_RD_OOSYNC;
2222         }
2223
2224         if (intstatus & I_SBINT) {
2225                 brcmf_err("Dongle reports SBINT\n");
2226                 intstatus &= ~I_SBINT;
2227         }
2228
2229         /* Would be active due to wake-wlan in gSPI */
2230         if (intstatus & I_CHIPACTIVE) {
2231                 brcmf_dbg(INFO, "Dongle reports CHIPACTIVE\n");
2232                 intstatus &= ~I_CHIPACTIVE;
2233         }
2234
2235         /* Ignore frame indications if rxskip is set */
2236         if (bus->rxskip)
2237                 intstatus &= ~I_HMB_FRAME_IND;
2238
2239         /* On frame indication, read available frames */
2240         if (PKT_AVAILABLE() && bus->clkstate == CLK_AVAIL) {
2241                 framecnt = brcmf_sdio_readframes(bus, rxlimit);
2242                 if (!bus->rxpending)
2243                         intstatus &= ~I_HMB_FRAME_IND;
2244                 rxlimit -= min(framecnt, rxlimit);
2245         }
2246
2247         /* Keep still-pending events for next scheduling */
2248         if (intstatus) {
2249                 for_each_set_bit(n, &intstatus, 32)
2250                         set_bit(n, (unsigned long *)&bus->intstatus.counter);
2251         }
2252
2253         brcmf_sdbrcm_clrintr(bus);
2254
2255         if (data_ok(bus) && bus->ctrl_frame_stat &&
2256                 (bus->clkstate == CLK_AVAIL)) {
2257                 int i;
2258
2259                 sdio_claim_host(bus->sdiodev->func[1]);
2260                 err = brcmf_sdcard_send_buf(bus->sdiodev, bus->sdiodev->sbwad,
2261                         SDIO_FUNC_2, F2SYNC, bus->ctrl_frame_buf,
2262                         (u32) bus->ctrl_frame_len);
2263
2264                 if (err < 0) {
2265                         /* On failure, abort the command and
2266                                 terminate the frame */
2267                         brcmf_dbg(INFO, "sdio error %d, abort command and terminate frame\n",
2268                                   err);
2269                         bus->sdcnt.tx_sderrs++;
2270
2271                         brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2);
2272
2273                         brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL,
2274                                          SFC_WF_TERM, &err);
2275                         bus->sdcnt.f1regdata++;
2276
2277                         for (i = 0; i < 3; i++) {
2278                                 u8 hi, lo;
2279                                 hi = brcmf_sdio_regrb(bus->sdiodev,
2280                                                       SBSDIO_FUNC1_WFRAMEBCHI,
2281                                                       &err);
2282                                 lo = brcmf_sdio_regrb(bus->sdiodev,
2283                                                       SBSDIO_FUNC1_WFRAMEBCLO,
2284                                                       &err);
2285                                 bus->sdcnt.f1regdata += 2;
2286                                 if ((hi == 0) && (lo == 0))
2287                                         break;
2288                         }
2289
2290                 } else {
2291                         bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP;
2292                 }
2293                 sdio_release_host(bus->sdiodev->func[1]);
2294                 bus->ctrl_frame_stat = false;
2295                 brcmf_sdbrcm_wait_event_wakeup(bus);
2296         }
2297         /* Send queued frames (limit 1 if rx may still be pending) */
2298         else if ((bus->clkstate == CLK_AVAIL) && !atomic_read(&bus->fcstate) &&
2299                  brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) && txlimit
2300                  && data_ok(bus)) {
2301                 framecnt = bus->rxpending ? min(txlimit, bus->txminmax) :
2302                                             txlimit;
2303                 framecnt = brcmf_sdbrcm_sendfromq(bus, framecnt);
2304                 txlimit -= framecnt;
2305         }
2306
2307         if ((bus->sdiodev->bus_if->state == BRCMF_BUS_DOWN) || (err != 0)) {
2308                 brcmf_err("failed backplane access over SDIO, halting operation\n");
2309                 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2310                 atomic_set(&bus->intstatus, 0);
2311         } else if (atomic_read(&bus->intstatus) ||
2312                    atomic_read(&bus->ipend) > 0 ||
2313                    (!atomic_read(&bus->fcstate) &&
2314                     brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) &&
2315                     data_ok(bus)) || PKT_AVAILABLE()) {
2316                 brcmf_sdbrcm_adddpctsk(bus);
2317         }
2318
2319         /* If we're done for now, turn off clock request. */
2320         if ((bus->clkstate != CLK_PENDING)
2321             && bus->idletime == BRCMF_IDLE_IMMEDIATE) {
2322                 bus->activity = false;
2323                 sdio_claim_host(bus->sdiodev->func[1]);
2324                 brcmf_sdbrcm_clkctl(bus, CLK_NONE, false);
2325                 sdio_release_host(bus->sdiodev->func[1]);
2326         }
2327 }
2328
2329 static int brcmf_sdbrcm_bus_txdata(struct device *dev, struct sk_buff *pkt)
2330 {
2331         int ret = -EBADE;
2332         uint datalen, prec;
2333         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
2334         struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
2335         struct brcmf_sdio *bus = sdiodev->bus;
2336         unsigned long flags;
2337
2338         brcmf_dbg(TRACE, "Enter\n");
2339
2340         datalen = pkt->len;
2341
2342         /* Add space for the header */
2343         skb_push(pkt, SDPCM_HDRLEN);
2344         /* precondition: IS_ALIGNED((unsigned long)(pkt->data), 2) */
2345
2346         prec = prio2prec((pkt->priority & PRIOMASK));
2347
2348         /* Check for existing queue, current flow-control,
2349                          pending event, or pending clock */
2350         brcmf_dbg(TRACE, "deferring pktq len %d\n", pktq_len(&bus->txq));
2351         bus->sdcnt.fcqueued++;
2352
2353         /* Priority based enq */
2354         spin_lock_bh(&bus->txqlock);
2355         if (!brcmf_c_prec_enq(bus->sdiodev->dev, &bus->txq, pkt, prec)) {
2356                 skb_pull(pkt, SDPCM_HDRLEN);
2357                 brcmf_txcomplete(bus->sdiodev->dev, pkt, false);
2358                 brcmu_pkt_buf_free_skb(pkt);
2359                 brcmf_err("out of bus->txq !!!\n");
2360                 ret = -ENOSR;
2361         } else {
2362                 ret = 0;
2363         }
2364         spin_unlock_bh(&bus->txqlock);
2365
2366         if (pktq_len(&bus->txq) >= TXHI) {
2367                 bus->txoff = true;
2368                 brcmf_txflowblock(bus->sdiodev->dev, true);
2369         }
2370
2371 #ifdef DEBUG
2372         if (pktq_plen(&bus->txq, prec) > qcount[prec])
2373                 qcount[prec] = pktq_plen(&bus->txq, prec);
2374 #endif
2375
2376         spin_lock_irqsave(&bus->dpc_tl_lock, flags);
2377         if (list_empty(&bus->dpc_tsklst)) {
2378                 spin_unlock_irqrestore(&bus->dpc_tl_lock, flags);
2379
2380                 brcmf_sdbrcm_adddpctsk(bus);
2381                 queue_work(bus->brcmf_wq, &bus->datawork);
2382         } else {
2383                 spin_unlock_irqrestore(&bus->dpc_tl_lock, flags);
2384         }
2385
2386         return ret;
2387 }
2388
2389 static int
2390 brcmf_sdbrcm_membytes(struct brcmf_sdio *bus, bool write, u32 address, u8 *data,
2391                  uint size)
2392 {
2393         int bcmerror = 0;
2394         u32 sdaddr;
2395         uint dsize;
2396
2397         /* Determine initial transfer parameters */
2398         sdaddr = address & SBSDIO_SB_OFT_ADDR_MASK;
2399         if ((sdaddr + size) & SBSDIO_SBWINDOW_MASK)
2400                 dsize = (SBSDIO_SB_OFT_ADDR_LIMIT - sdaddr);
2401         else
2402                 dsize = size;
2403
2404         sdio_claim_host(bus->sdiodev->func[1]);
2405
2406         /* Set the backplane window to include the start address */
2407         bcmerror = brcmf_sdcard_set_sbaddr_window(bus->sdiodev, address);
2408         if (bcmerror) {
2409                 brcmf_err("window change failed\n");
2410                 goto xfer_done;
2411         }
2412
2413         /* Do the transfer(s) */
2414         while (size) {
2415                 brcmf_dbg(INFO, "%s %d bytes at offset 0x%08x in window 0x%08x\n",
2416                           write ? "write" : "read", dsize,
2417                           sdaddr, address & SBSDIO_SBWINDOW_MASK);
2418                 bcmerror = brcmf_sdcard_rwdata(bus->sdiodev, write,
2419                                                sdaddr, data, dsize);
2420                 if (bcmerror) {
2421                         brcmf_err("membytes transfer failed\n");
2422                         break;
2423                 }
2424
2425                 /* Adjust for next transfer (if any) */
2426                 size -= dsize;
2427                 if (size) {
2428                         data += dsize;
2429                         address += dsize;
2430                         bcmerror = brcmf_sdcard_set_sbaddr_window(bus->sdiodev,
2431                                                                   address);
2432                         if (bcmerror) {
2433                                 brcmf_err("window change failed\n");
2434                                 break;
2435                         }
2436                         sdaddr = 0;
2437                         dsize = min_t(uint, SBSDIO_SB_OFT_ADDR_LIMIT, size);
2438                 }
2439         }
2440
2441 xfer_done:
2442         /* Return the window to backplane enumeration space for core access */
2443         if (brcmf_sdcard_set_sbaddr_window(bus->sdiodev, bus->sdiodev->sbwad))
2444                 brcmf_err("FAILED to set window back to 0x%x\n",
2445                           bus->sdiodev->sbwad);
2446
2447         sdio_release_host(bus->sdiodev->func[1]);
2448
2449         return bcmerror;
2450 }
2451
2452 #ifdef DEBUG
2453 #define CONSOLE_LINE_MAX        192
2454
2455 static int brcmf_sdbrcm_readconsole(struct brcmf_sdio *bus)
2456 {
2457         struct brcmf_console *c = &bus->console;
2458         u8 line[CONSOLE_LINE_MAX], ch;
2459         u32 n, idx, addr;
2460         int rv;
2461
2462         /* Don't do anything until FWREADY updates console address */
2463         if (bus->console_addr == 0)
2464                 return 0;
2465
2466         /* Read console log struct */
2467         addr = bus->console_addr + offsetof(struct rte_console, log_le);
2468         rv = brcmf_sdbrcm_membytes(bus, false, addr, (u8 *)&c->log_le,
2469                                    sizeof(c->log_le));
2470         if (rv < 0)
2471                 return rv;
2472
2473         /* Allocate console buffer (one time only) */
2474         if (c->buf == NULL) {
2475                 c->bufsize = le32_to_cpu(c->log_le.buf_size);
2476                 c->buf = kmalloc(c->bufsize, GFP_ATOMIC);
2477                 if (c->buf == NULL)
2478                         return -ENOMEM;
2479         }
2480
2481         idx = le32_to_cpu(c->log_le.idx);
2482
2483         /* Protect against corrupt value */
2484         if (idx > c->bufsize)
2485                 return -EBADE;
2486
2487         /* Skip reading the console buffer if the index pointer
2488          has not moved */
2489         if (idx == c->last)
2490                 return 0;
2491
2492         /* Read the console buffer */
2493         addr = le32_to_cpu(c->log_le.buf);
2494         rv = brcmf_sdbrcm_membytes(bus, false, addr, c->buf, c->bufsize);
2495         if (rv < 0)
2496                 return rv;
2497
2498         while (c->last != idx) {
2499                 for (n = 0; n < CONSOLE_LINE_MAX - 2; n++) {
2500                         if (c->last == idx) {
2501                                 /* This would output a partial line.
2502                                  * Instead, back up
2503                                  * the buffer pointer and output this
2504                                  * line next time around.
2505                                  */
2506                                 if (c->last >= n)
2507                                         c->last -= n;
2508                                 else
2509                                         c->last = c->bufsize - n;
2510                                 goto break2;
2511                         }
2512                         ch = c->buf[c->last];
2513                         c->last = (c->last + 1) % c->bufsize;
2514                         if (ch == '\n')
2515                                 break;
2516                         line[n] = ch;
2517                 }
2518
2519                 if (n > 0) {
2520                         if (line[n - 1] == '\r')
2521                                 n--;
2522                         line[n] = 0;
2523                         pr_debug("CONSOLE: %s\n", line);
2524                 }
2525         }
2526 break2:
2527
2528         return 0;
2529 }
2530 #endif                          /* DEBUG */
2531
2532 static int brcmf_tx_frame(struct brcmf_sdio *bus, u8 *frame, u16 len)
2533 {
2534         int i;
2535         int ret;
2536
2537         bus->ctrl_frame_stat = false;
2538         ret = brcmf_sdcard_send_buf(bus->sdiodev, bus->sdiodev->sbwad,
2539                                     SDIO_FUNC_2, F2SYNC, frame, len);
2540
2541         if (ret < 0) {
2542                 /* On failure, abort the command and terminate the frame */
2543                 brcmf_dbg(INFO, "sdio error %d, abort command and terminate frame\n",
2544                           ret);
2545                 bus->sdcnt.tx_sderrs++;
2546
2547                 brcmf_sdcard_abort(bus->sdiodev, SDIO_FUNC_2);
2548
2549                 brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL,
2550                                  SFC_WF_TERM, NULL);
2551                 bus->sdcnt.f1regdata++;
2552
2553                 for (i = 0; i < 3; i++) {
2554                         u8 hi, lo;
2555                         hi = brcmf_sdio_regrb(bus->sdiodev,
2556                                               SBSDIO_FUNC1_WFRAMEBCHI, NULL);
2557                         lo = brcmf_sdio_regrb(bus->sdiodev,
2558                                               SBSDIO_FUNC1_WFRAMEBCLO, NULL);
2559                         bus->sdcnt.f1regdata += 2;
2560                         if (hi == 0 && lo == 0)
2561                                 break;
2562                 }
2563                 return ret;
2564         }
2565
2566         bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQUENCE_WRAP;
2567
2568         return ret;
2569 }
2570
2571 static int
2572 brcmf_sdbrcm_bus_txctl(struct device *dev, unsigned char *msg, uint msglen)
2573 {
2574         u8 *frame;
2575         u16 len;
2576         u32 swheader;
2577         uint retries = 0;
2578         u8 doff = 0;
2579         int ret = -1;
2580         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
2581         struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
2582         struct brcmf_sdio *bus = sdiodev->bus;
2583         unsigned long flags;
2584
2585         brcmf_dbg(TRACE, "Enter\n");
2586
2587         /* Back the pointer to make a room for bus header */
2588         frame = msg - SDPCM_HDRLEN;
2589         len = (msglen += SDPCM_HDRLEN);
2590
2591         /* Add alignment padding (optional for ctl frames) */
2592         doff = ((unsigned long)frame % BRCMF_SDALIGN);
2593         if (doff) {
2594                 frame -= doff;
2595                 len += doff;
2596                 msglen += doff;
2597                 memset(frame, 0, doff + SDPCM_HDRLEN);
2598         }
2599         /* precondition: doff < BRCMF_SDALIGN */
2600         doff += SDPCM_HDRLEN;
2601
2602         /* Round send length to next SDIO block */
2603         if (bus->roundup && bus->blocksize && (len > bus->blocksize)) {
2604                 u16 pad = bus->blocksize - (len % bus->blocksize);
2605                 if ((pad <= bus->roundup) && (pad < bus->blocksize))
2606                         len += pad;
2607         } else if (len % BRCMF_SDALIGN) {
2608                 len += BRCMF_SDALIGN - (len % BRCMF_SDALIGN);
2609         }
2610
2611         /* Satisfy length-alignment requirements */
2612         if (len & (ALIGNMENT - 1))
2613                 len = roundup(len, ALIGNMENT);
2614
2615         /* precondition: IS_ALIGNED((unsigned long)frame, 2) */
2616
2617         /* Make sure backplane clock is on */
2618         sdio_claim_host(bus->sdiodev->func[1]);
2619         brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false);
2620         sdio_release_host(bus->sdiodev->func[1]);
2621
2622         /* Hardware tag: 2 byte len followed by 2 byte ~len check (all LE) */
2623         *(__le16 *) frame = cpu_to_le16((u16) msglen);
2624         *(((__le16 *) frame) + 1) = cpu_to_le16(~msglen);
2625
2626         /* Software tag: channel, sequence number, data offset */
2627         swheader =
2628             ((SDPCM_CONTROL_CHANNEL << SDPCM_CHANNEL_SHIFT) &
2629              SDPCM_CHANNEL_MASK)
2630             | bus->tx_seq | ((doff << SDPCM_DOFFSET_SHIFT) &
2631                              SDPCM_DOFFSET_MASK);
2632         put_unaligned_le32(swheader, frame + SDPCM_FRAMETAG_LEN);
2633         put_unaligned_le32(0, frame + SDPCM_FRAMETAG_LEN + sizeof(swheader));
2634
2635         if (!data_ok(bus)) {
2636                 brcmf_dbg(INFO, "No bus credit bus->tx_max %d, bus->tx_seq %d\n",
2637                           bus->tx_max, bus->tx_seq);
2638                 bus->ctrl_frame_stat = true;
2639                 /* Send from dpc */
2640                 bus->ctrl_frame_buf = frame;
2641                 bus->ctrl_frame_len = len;
2642
2643                 wait_event_interruptible_timeout(bus->ctrl_wait,
2644                                                  !bus->ctrl_frame_stat,
2645                                                  msecs_to_jiffies(2000));
2646
2647                 if (!bus->ctrl_frame_stat) {
2648                         brcmf_dbg(INFO, "ctrl_frame_stat == false\n");
2649                         ret = 0;
2650                 } else {
2651                         brcmf_dbg(INFO, "ctrl_frame_stat == true\n");
2652                         ret = -1;
2653                 }
2654         }
2655
2656         if (ret == -1) {
2657                 brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_CTL_ON(),
2658                                    frame, len, "Tx Frame:\n");
2659                 brcmf_dbg_hex_dump(!(BRCMF_BYTES_ON() && BRCMF_CTL_ON()) &&
2660                                    BRCMF_HDRS_ON(),
2661                                    frame, min_t(u16, len, 16), "TxHdr:\n");
2662
2663                 do {
2664                         sdio_claim_host(bus->sdiodev->func[1]);
2665                         ret = brcmf_tx_frame(bus, frame, len);
2666                         sdio_release_host(bus->sdiodev->func[1]);
2667                 } while (ret < 0 && retries++ < TXRETRIES);
2668         }
2669
2670         spin_lock_irqsave(&bus->dpc_tl_lock, flags);
2671         if ((bus->idletime == BRCMF_IDLE_IMMEDIATE) &&
2672             list_empty(&bus->dpc_tsklst)) {
2673                 spin_unlock_irqrestore(&bus->dpc_tl_lock, flags);
2674
2675                 bus->activity = false;
2676                 sdio_claim_host(bus->sdiodev->func[1]);
2677                 brcmf_sdbrcm_clkctl(bus, CLK_NONE, true);
2678                 sdio_release_host(bus->sdiodev->func[1]);
2679         } else {
2680                 spin_unlock_irqrestore(&bus->dpc_tl_lock, flags);
2681         }
2682
2683         if (ret)
2684                 bus->sdcnt.tx_ctlerrs++;
2685         else
2686                 bus->sdcnt.tx_ctlpkts++;
2687
2688         return ret ? -EIO : 0;
2689 }
2690
2691 #ifdef DEBUG
2692 static inline bool brcmf_sdio_valid_shared_address(u32 addr)
2693 {
2694         return !(addr == 0 || ((~addr >> 16) & 0xffff) == (addr & 0xffff));
2695 }
2696
2697 static int brcmf_sdio_readshared(struct brcmf_sdio *bus,
2698                                  struct sdpcm_shared *sh)
2699 {
2700         u32 addr;
2701         int rv;
2702         u32 shaddr = 0;
2703         struct sdpcm_shared_le sh_le;
2704         __le32 addr_le;
2705
2706         shaddr = bus->ramsize - 4;
2707
2708         /*
2709          * Read last word in socram to determine
2710          * address of sdpcm_shared structure
2711          */
2712         sdio_claim_host(bus->sdiodev->func[1]);
2713         rv = brcmf_sdbrcm_membytes(bus, false, shaddr,
2714                                    (u8 *)&addr_le, 4);
2715         sdio_claim_host(bus->sdiodev->func[1]);
2716         if (rv < 0)
2717                 return rv;
2718
2719         addr = le32_to_cpu(addr_le);
2720
2721         brcmf_dbg(INFO, "sdpcm_shared address 0x%08X\n", addr);
2722
2723         /*
2724          * Check if addr is valid.
2725          * NVRAM length at the end of memory should have been overwritten.
2726          */
2727         if (!brcmf_sdio_valid_shared_address(addr)) {
2728                         brcmf_err("invalid sdpcm_shared address 0x%08X\n",
2729                                   addr);
2730                         return -EINVAL;
2731         }
2732
2733         /* Read hndrte_shared structure */
2734         sdio_claim_host(bus->sdiodev->func[1]);
2735         rv = brcmf_sdbrcm_membytes(bus, false, addr, (u8 *)&sh_le,
2736                                    sizeof(struct sdpcm_shared_le));
2737         sdio_release_host(bus->sdiodev->func[1]);
2738         if (rv < 0)
2739                 return rv;
2740
2741         /* Endianness */
2742         sh->flags = le32_to_cpu(sh_le.flags);
2743         sh->trap_addr = le32_to_cpu(sh_le.trap_addr);
2744         sh->assert_exp_addr = le32_to_cpu(sh_le.assert_exp_addr);
2745         sh->assert_file_addr = le32_to_cpu(sh_le.assert_file_addr);
2746         sh->assert_line = le32_to_cpu(sh_le.assert_line);
2747         sh->console_addr = le32_to_cpu(sh_le.console_addr);
2748         sh->msgtrace_addr = le32_to_cpu(sh_le.msgtrace_addr);
2749
2750         if ((sh->flags & SDPCM_SHARED_VERSION_MASK) != SDPCM_SHARED_VERSION) {
2751                 brcmf_err("sdpcm_shared version mismatch: dhd %d dongle %d\n",
2752                           SDPCM_SHARED_VERSION,
2753                           sh->flags & SDPCM_SHARED_VERSION_MASK);
2754                 return -EPROTO;
2755         }
2756
2757         return 0;
2758 }
2759
2760 static int brcmf_sdio_dump_console(struct brcmf_sdio *bus,
2761                                    struct sdpcm_shared *sh, char __user *data,
2762                                    size_t count)
2763 {
2764         u32 addr, console_ptr, console_size, console_index;
2765         char *conbuf = NULL;
2766         __le32 sh_val;
2767         int rv;
2768         loff_t pos = 0;
2769         int nbytes = 0;
2770
2771         /* obtain console information from device memory */
2772         addr = sh->console_addr + offsetof(struct rte_console, log_le);
2773         rv = brcmf_sdbrcm_membytes(bus, false, addr,
2774                         (u8 *)&sh_val, sizeof(u32));
2775         if (rv < 0)
2776                 return rv;
2777         console_ptr = le32_to_cpu(sh_val);
2778
2779         addr = sh->console_addr + offsetof(struct rte_console, log_le.buf_size);
2780         rv = brcmf_sdbrcm_membytes(bus, false, addr,
2781                         (u8 *)&sh_val, sizeof(u32));
2782         if (rv < 0)
2783                 return rv;
2784         console_size = le32_to_cpu(sh_val);
2785
2786         addr = sh->console_addr + offsetof(struct rte_console, log_le.idx);
2787         rv = brcmf_sdbrcm_membytes(bus, false, addr,
2788                         (u8 *)&sh_val, sizeof(u32));
2789         if (rv < 0)
2790                 return rv;
2791         console_index = le32_to_cpu(sh_val);
2792
2793         /* allocate buffer for console data */
2794         if (console_size <= CONSOLE_BUFFER_MAX)
2795                 conbuf = vzalloc(console_size+1);
2796
2797         if (!conbuf)
2798                 return -ENOMEM;
2799
2800         /* obtain the console data from device */
2801         conbuf[console_size] = '\0';
2802         rv = brcmf_sdbrcm_membytes(bus, false, console_ptr, (u8 *)conbuf,
2803                                    console_size);
2804         if (rv < 0)
2805                 goto done;
2806
2807         rv = simple_read_from_buffer(data, count, &pos,
2808                                      conbuf + console_index,
2809                                      console_size - console_index);
2810         if (rv < 0)
2811                 goto done;
2812
2813         nbytes = rv;
2814         if (console_index > 0) {
2815                 pos = 0;
2816                 rv = simple_read_from_buffer(data+nbytes, count, &pos,
2817                                              conbuf, console_index - 1);
2818                 if (rv < 0)
2819                         goto done;
2820                 rv += nbytes;
2821         }
2822 done:
2823         vfree(conbuf);
2824         return rv;
2825 }
2826
2827 static int brcmf_sdio_trap_info(struct brcmf_sdio *bus, struct sdpcm_shared *sh,
2828                                 char __user *data, size_t count)
2829 {
2830         int error, res;
2831         char buf[350];
2832         struct brcmf_trap_info tr;
2833         int nbytes;
2834         loff_t pos = 0;
2835
2836         if ((sh->flags & SDPCM_SHARED_TRAP) == 0)
2837                 return 0;
2838
2839         sdio_claim_host(bus->sdiodev->func[1]);
2840         error = brcmf_sdbrcm_membytes(bus, false, sh->trap_addr, (u8 *)&tr,
2841                                       sizeof(struct brcmf_trap_info));
2842         if (error < 0)
2843                 return error;
2844
2845         nbytes = brcmf_sdio_dump_console(bus, sh, data, count);
2846         sdio_release_host(bus->sdiodev->func[1]);
2847         if (nbytes < 0)
2848                 return nbytes;
2849
2850         res = scnprintf(buf, sizeof(buf),
2851                         "dongle trap info: type 0x%x @ epc 0x%08x\n"
2852                         "  cpsr 0x%08x spsr 0x%08x sp 0x%08x\n"
2853                         "  lr   0x%08x pc   0x%08x offset 0x%x\n"
2854                         "  r0   0x%08x r1   0x%08x r2 0x%08x r3 0x%08x\n"
2855                         "  r4   0x%08x r5   0x%08x r6 0x%08x r7 0x%08x\n",
2856                         le32_to_cpu(tr.type), le32_to_cpu(tr.epc),
2857                         le32_to_cpu(tr.cpsr), le32_to_cpu(tr.spsr),
2858                         le32_to_cpu(tr.r13), le32_to_cpu(tr.r14),
2859                         le32_to_cpu(tr.pc), sh->trap_addr,
2860                         le32_to_cpu(tr.r0), le32_to_cpu(tr.r1),
2861                         le32_to_cpu(tr.r2), le32_to_cpu(tr.r3),
2862                         le32_to_cpu(tr.r4), le32_to_cpu(tr.r5),
2863                         le32_to_cpu(tr.r6), le32_to_cpu(tr.r7));
2864
2865         error = simple_read_from_buffer(data+nbytes, count, &pos, buf, res);
2866         if (error < 0)
2867                 return error;
2868
2869         nbytes += error;
2870         return nbytes;
2871 }
2872
2873 static int brcmf_sdio_assert_info(struct brcmf_sdio *bus,
2874                                   struct sdpcm_shared *sh, char __user *data,
2875                                   size_t count)
2876 {
2877         int error = 0;
2878         char buf[200];
2879         char file[80] = "?";
2880         char expr[80] = "<???>";
2881         int res;
2882         loff_t pos = 0;
2883
2884         if ((sh->flags & SDPCM_SHARED_ASSERT_BUILT) == 0) {
2885                 brcmf_dbg(INFO, "firmware not built with -assert\n");
2886                 return 0;
2887         } else if ((sh->flags & SDPCM_SHARED_ASSERT) == 0) {
2888                 brcmf_dbg(INFO, "no assert in dongle\n");
2889                 return 0;
2890         }
2891
2892         sdio_claim_host(bus->sdiodev->func[1]);
2893         if (sh->assert_file_addr != 0) {
2894                 error = brcmf_sdbrcm_membytes(bus, false, sh->assert_file_addr,
2895                                               (u8 *)file, 80);
2896                 if (error < 0)
2897                         return error;
2898         }
2899         if (sh->assert_exp_addr != 0) {
2900                 error = brcmf_sdbrcm_membytes(bus, false, sh->assert_exp_addr,
2901                                               (u8 *)expr, 80);
2902                 if (error < 0)
2903                         return error;
2904         }
2905         sdio_release_host(bus->sdiodev->func[1]);
2906
2907         res = scnprintf(buf, sizeof(buf),
2908                         "dongle assert: %s:%d: assert(%s)\n",
2909                         file, sh->assert_line, expr);
2910         return simple_read_from_buffer(data, count, &pos, buf, res);
2911 }
2912
2913 static int brcmf_sdbrcm_checkdied(struct brcmf_sdio *bus)
2914 {
2915         int error;
2916         struct sdpcm_shared sh;
2917
2918         error = brcmf_sdio_readshared(bus, &sh);
2919
2920         if (error < 0)
2921                 return error;
2922
2923         if ((sh.flags & SDPCM_SHARED_ASSERT_BUILT) == 0)
2924                 brcmf_dbg(INFO, "firmware not built with -assert\n");
2925         else if (sh.flags & SDPCM_SHARED_ASSERT)
2926                 brcmf_err("assertion in dongle\n");
2927
2928         if (sh.flags & SDPCM_SHARED_TRAP)
2929                 brcmf_err("firmware trap in dongle\n");
2930
2931         return 0;
2932 }
2933
2934 static int brcmf_sdbrcm_died_dump(struct brcmf_sdio *bus, char __user *data,
2935                                   size_t count, loff_t *ppos)
2936 {
2937         int error = 0;
2938         struct sdpcm_shared sh;
2939         int nbytes = 0;
2940         loff_t pos = *ppos;
2941
2942         if (pos != 0)
2943                 return 0;
2944
2945         error = brcmf_sdio_readshared(bus, &sh);
2946         if (error < 0)
2947                 goto done;
2948
2949         error = brcmf_sdio_assert_info(bus, &sh, data, count);
2950         if (error < 0)
2951                 goto done;
2952
2953         nbytes = error;
2954         error = brcmf_sdio_trap_info(bus, &sh, data, count);
2955         if (error < 0)
2956                 goto done;
2957
2958         error += nbytes;
2959         *ppos += error;
2960 done:
2961         return error;
2962 }
2963
2964 static ssize_t brcmf_sdio_forensic_read(struct file *f, char __user *data,
2965                                         size_t count, loff_t *ppos)
2966 {
2967         struct brcmf_sdio *bus = f->private_data;
2968         int res;
2969
2970         res = brcmf_sdbrcm_died_dump(bus, data, count, ppos);
2971         if (res > 0)
2972                 *ppos += res;
2973         return (ssize_t)res;
2974 }
2975
2976 static const struct file_operations brcmf_sdio_forensic_ops = {
2977         .owner = THIS_MODULE,
2978         .open = simple_open,
2979         .read = brcmf_sdio_forensic_read
2980 };
2981
2982 static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus)
2983 {
2984         struct brcmf_pub *drvr = bus->sdiodev->bus_if->drvr;
2985         struct dentry *dentry = brcmf_debugfs_get_devdir(drvr);
2986
2987         if (IS_ERR_OR_NULL(dentry))
2988                 return;
2989
2990         debugfs_create_file("forensics", S_IRUGO, dentry, bus,
2991                             &brcmf_sdio_forensic_ops);
2992         brcmf_debugfs_create_sdio_count(drvr, &bus->sdcnt);
2993 }
2994 #else
2995 static int brcmf_sdbrcm_checkdied(struct brcmf_sdio *bus)
2996 {
2997         return 0;
2998 }
2999
3000 static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus)
3001 {
3002 }
3003 #endif /* DEBUG */
3004
3005 static int
3006 brcmf_sdbrcm_bus_rxctl(struct device *dev, unsigned char *msg, uint msglen)
3007 {
3008         int timeleft;
3009         uint rxlen = 0;
3010         bool pending;
3011         u8 *buf;
3012         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
3013         struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
3014         struct brcmf_sdio *bus = sdiodev->bus;
3015
3016         brcmf_dbg(TRACE, "Enter\n");
3017
3018         /* Wait until control frame is available */
3019         timeleft = brcmf_sdbrcm_dcmd_resp_wait(bus, &bus->rxlen, &pending);
3020
3021         spin_lock_bh(&bus->rxctl_lock);
3022         rxlen = bus->rxlen;
3023         memcpy(msg, bus->rxctl, min(msglen, rxlen));
3024         bus->rxctl = NULL;
3025         buf = bus->rxctl_orig;
3026         bus->rxctl_orig = NULL;
3027         bus->rxlen = 0;
3028         spin_unlock_bh(&bus->rxctl_lock);
3029         vfree(buf);
3030
3031         if (rxlen) {
3032                 brcmf_dbg(CTL, "resumed on rxctl frame, got %d expected %d\n",
3033                           rxlen, msglen);
3034         } else if (timeleft == 0) {
3035                 brcmf_err("resumed on timeout\n");
3036                 brcmf_sdbrcm_checkdied(bus);
3037         } else if (pending) {
3038                 brcmf_dbg(CTL, "cancelled\n");
3039                 return -ERESTARTSYS;
3040         } else {
3041                 brcmf_dbg(CTL, "resumed for unknown reason?\n");
3042                 brcmf_sdbrcm_checkdied(bus);
3043         }
3044
3045         if (rxlen)
3046                 bus->sdcnt.rx_ctlpkts++;
3047         else
3048                 bus->sdcnt.rx_ctlerrs++;
3049
3050         return rxlen ? (int)rxlen : -ETIMEDOUT;
3051 }
3052
3053 static int brcmf_sdbrcm_write_vars(struct brcmf_sdio *bus)
3054 {
3055         int bcmerror = 0;
3056         u32 varaddr;
3057         u32 varsizew;
3058         __le32 varsizew_le;
3059 #ifdef DEBUG
3060         char *nvram_ularray;
3061 #endif                          /* DEBUG */
3062
3063         /* Even if there are no vars are to be written, we still
3064                  need to set the ramsize. */
3065         varaddr = (bus->ramsize - 4) - bus->varsz;
3066
3067         if (bus->vars) {
3068                 /* Write the vars list */
3069                 bcmerror = brcmf_sdbrcm_membytes(bus, true, varaddr,
3070                                                  bus->vars, bus->varsz);
3071 #ifdef DEBUG
3072                 /* Verify NVRAM bytes */
3073                 brcmf_dbg(INFO, "Compare NVRAM dl & ul; varsize=%d\n",
3074                           bus->varsz);
3075                 nvram_ularray = kmalloc(bus->varsz, GFP_ATOMIC);
3076                 if (!nvram_ularray)
3077                         return -ENOMEM;
3078
3079                 /* Upload image to verify downloaded contents. */
3080                 memset(nvram_ularray, 0xaa, bus->varsz);
3081
3082                 /* Read the vars list to temp buffer for comparison */
3083                 bcmerror = brcmf_sdbrcm_membytes(bus, false, varaddr,
3084                                                  nvram_ularray, bus->varsz);
3085                 if (bcmerror) {
3086                         brcmf_err("error %d on reading %d nvram bytes at 0x%08x\n",
3087                                   bcmerror, bus->varsz, varaddr);
3088                 }
3089                 /* Compare the org NVRAM with the one read from RAM */
3090                 if (memcmp(bus->vars, nvram_ularray, bus->varsz))
3091                         brcmf_err("Downloaded NVRAM image is corrupted\n");
3092                 else
3093                         brcmf_err("Download/Upload/Compare of NVRAM ok\n");
3094
3095                 kfree(nvram_ularray);
3096 #endif                          /* DEBUG */
3097         }
3098
3099         /* adjust to the user specified RAM */
3100         brcmf_dbg(INFO, "Physical memory size: %d\n", bus->ramsize);
3101         brcmf_dbg(INFO, "Vars are at %d, orig varsize is %d\n",
3102                   varaddr, bus->varsz);
3103
3104         /*
3105          * Determine the length token:
3106          * Varsize, converted to words, in lower 16-bits, checksum
3107          * in upper 16-bits.
3108          */
3109         if (bcmerror) {
3110                 varsizew = 0;
3111                 varsizew_le = cpu_to_le32(0);
3112         } else {
3113                 varsizew = bus->varsz / 4;
3114                 varsizew = (~varsizew << 16) | (varsizew & 0x0000FFFF);
3115                 varsizew_le = cpu_to_le32(varsizew);
3116         }
3117
3118         brcmf_dbg(INFO, "New varsize is %d, length token=0x%08x\n",
3119                   bus->varsz, varsizew);
3120
3121         /* Write the length token to the last word */
3122         bcmerror = brcmf_sdbrcm_membytes(bus, true, (bus->ramsize - 4),
3123                                          (u8 *)&varsizew_le, 4);
3124
3125         return bcmerror;
3126 }
3127
3128 static int brcmf_sdbrcm_download_state(struct brcmf_sdio *bus, bool enter)
3129 {
3130         int bcmerror = 0;
3131         struct chip_info *ci = bus->ci;
3132
3133         /* To enter download state, disable ARM and reset SOCRAM.
3134          * To exit download state, simply reset ARM (default is RAM boot).
3135          */
3136         if (enter) {
3137                 bus->alp_only = true;
3138
3139                 ci->coredisable(bus->sdiodev, ci, BCMA_CORE_ARM_CM3);
3140
3141                 ci->resetcore(bus->sdiodev, ci, BCMA_CORE_INTERNAL_MEM);
3142
3143                 /* Clear the top bit of memory */
3144                 if (bus->ramsize) {
3145                         u32 zeros = 0;
3146                         brcmf_sdbrcm_membytes(bus, true, bus->ramsize - 4,
3147                                          (u8 *)&zeros, 4);
3148                 }
3149         } else {
3150                 if (!ci->iscoreup(bus->sdiodev, ci, BCMA_CORE_INTERNAL_MEM)) {
3151                         brcmf_err("SOCRAM core is down after reset?\n");
3152                         bcmerror = -EBADE;
3153                         goto fail;
3154                 }
3155
3156                 bcmerror = brcmf_sdbrcm_write_vars(bus);
3157                 if (bcmerror) {
3158                         brcmf_err("no vars written to RAM\n");
3159                         bcmerror = 0;
3160                 }
3161
3162                 w_sdreg32(bus, 0xFFFFFFFF,
3163                           offsetof(struct sdpcmd_regs, intstatus));
3164
3165                 ci->resetcore(bus->sdiodev, ci, BCMA_CORE_ARM_CM3);
3166
3167                 /* Allow HT Clock now that the ARM is running. */
3168                 bus->alp_only = false;
3169
3170                 bus->sdiodev->bus_if->state = BRCMF_BUS_LOAD;
3171         }
3172 fail:
3173         return bcmerror;
3174 }
3175
3176 static int brcmf_sdbrcm_get_image(char *buf, int len, struct brcmf_sdio *bus)
3177 {
3178         if (bus->firmware->size < bus->fw_ptr + len)
3179                 len = bus->firmware->size - bus->fw_ptr;
3180
3181         memcpy(buf, &bus->firmware->data[bus->fw_ptr], len);
3182         bus->fw_ptr += len;
3183         return len;
3184 }
3185
3186 static int brcmf_sdbrcm_download_code_file(struct brcmf_sdio *bus)
3187 {
3188         int offset = 0;
3189         uint len;
3190         u8 *memblock = NULL, *memptr;
3191         int ret;
3192
3193         brcmf_dbg(INFO, "Enter\n");
3194
3195         ret = request_firmware(&bus->firmware, BRCMF_SDIO_FW_NAME,
3196                                &bus->sdiodev->func[2]->dev);
3197         if (ret) {
3198                 brcmf_err("Fail to request firmware %d\n", ret);
3199                 return ret;
3200         }
3201         bus->fw_ptr = 0;
3202
3203         memptr = memblock = kmalloc(MEMBLOCK + BRCMF_SDALIGN, GFP_ATOMIC);
3204         if (memblock == NULL) {
3205                 ret = -ENOMEM;
3206                 goto err;
3207         }
3208         if ((u32)(unsigned long)memblock % BRCMF_SDALIGN)
3209                 memptr += (BRCMF_SDALIGN -
3210                            ((u32)(unsigned long)memblock % BRCMF_SDALIGN));
3211
3212         /* Download image */
3213         while ((len =
3214                 brcmf_sdbrcm_get_image((char *)memptr, MEMBLOCK, bus))) {
3215                 ret = brcmf_sdbrcm_membytes(bus, true, offset, memptr, len);
3216                 if (ret) {
3217                         brcmf_err("error %d on writing %d membytes at 0x%08x\n",
3218                                   ret, MEMBLOCK, offset);
3219                         goto err;
3220                 }
3221
3222                 offset += MEMBLOCK;
3223         }
3224
3225 err:
3226         kfree(memblock);
3227
3228         release_firmware(bus->firmware);
3229         bus->fw_ptr = 0;
3230
3231         return ret;
3232 }
3233
3234 /*
3235  * ProcessVars:Takes a buffer of "<var>=<value>\n" lines read from a file
3236  * and ending in a NUL.
3237  * Removes carriage returns, empty lines, comment lines, and converts
3238  * newlines to NULs.
3239  * Shortens buffer as needed and pads with NULs.  End of buffer is marked
3240  * by two NULs.
3241 */
3242
3243 static int brcmf_process_nvram_vars(struct brcmf_sdio *bus)
3244 {
3245         char *varbuf;
3246         char *dp;
3247         bool findNewline;
3248         int column;
3249         int ret = 0;
3250         uint buf_len, n, len;
3251
3252         len = bus->firmware->size;
3253         varbuf = vmalloc(len);
3254         if (!varbuf)
3255                 return -ENOMEM;
3256
3257         memcpy(varbuf, bus->firmware->data, len);
3258         dp = varbuf;
3259
3260         findNewline = false;
3261         column = 0;
3262
3263         for (n = 0; n < len; n++) {
3264                 if (varbuf[n] == 0)
3265                         break;
3266                 if (varbuf[n] == '\r')
3267                         continue;
3268                 if (findNewline && varbuf[n] != '\n')
3269                         continue;
3270                 findNewline = false;
3271                 if (varbuf[n] == '#') {
3272                         findNewline = true;
3273                         continue;
3274                 }
3275                 if (varbuf[n] == '\n') {
3276                         if (column == 0)
3277                                 continue;
3278                         *dp++ = 0;
3279                         column = 0;
3280                         continue;
3281                 }
3282                 *dp++ = varbuf[n];
3283                 column++;
3284         }
3285         buf_len = dp - varbuf;
3286         while (dp < varbuf + n)
3287                 *dp++ = 0;
3288
3289         kfree(bus->vars);
3290         /* roundup needed for download to device */
3291         bus->varsz = roundup(buf_len + 1, 4);
3292         bus->vars = kmalloc(bus->varsz, GFP_KERNEL);
3293         if (bus->vars == NULL) {
3294                 bus->varsz = 0;
3295                 ret = -ENOMEM;
3296                 goto err;
3297         }
3298
3299         /* copy the processed variables and add null termination */
3300         memcpy(bus->vars, varbuf, buf_len);
3301         bus->vars[buf_len] = 0;
3302 err:
3303         vfree(varbuf);
3304         return ret;
3305 }
3306
3307 static int brcmf_sdbrcm_download_nvram(struct brcmf_sdio *bus)
3308 {
3309         int ret;
3310
3311         if (bus->sdiodev->bus_if->drvr_up)
3312                 return -EISCONN;
3313
3314         ret = request_firmware(&bus->firmware, BRCMF_SDIO_NV_NAME,
3315                                &bus->sdiodev->func[2]->dev);
3316         if (ret) {
3317                 brcmf_err("Fail to request nvram %d\n", ret);
3318                 return ret;
3319         }
3320
3321         ret = brcmf_process_nvram_vars(bus);
3322
3323         release_firmware(bus->firmware);
3324
3325         return ret;
3326 }
3327
3328 static int _brcmf_sdbrcm_download_firmware(struct brcmf_sdio *bus)
3329 {
3330         int bcmerror = -1;
3331
3332         /* Keep arm in reset */
3333         if (brcmf_sdbrcm_download_state(bus, true)) {
3334                 brcmf_err("error placing ARM core in reset\n");
3335                 goto err;
3336         }
3337
3338         /* External image takes precedence if specified */
3339         if (brcmf_sdbrcm_download_code_file(bus)) {
3340                 brcmf_err("dongle image file download failed\n");
3341                 goto err;
3342         }
3343
3344         /* External nvram takes precedence if specified */
3345         if (brcmf_sdbrcm_download_nvram(bus))
3346                 brcmf_err("dongle nvram file download failed\n");
3347
3348         /* Take arm out of reset */
3349         if (brcmf_sdbrcm_download_state(bus, false)) {
3350                 brcmf_err("error getting out of ARM core reset\n");
3351                 goto err;
3352         }
3353
3354         bcmerror = 0;
3355
3356 err:
3357         return bcmerror;
3358 }
3359
3360 static bool
3361 brcmf_sdbrcm_download_firmware(struct brcmf_sdio *bus)
3362 {
3363         bool ret;
3364
3365         sdio_claim_host(bus->sdiodev->func[1]);
3366
3367         brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false);
3368
3369         ret = _brcmf_sdbrcm_download_firmware(bus) == 0;
3370
3371         brcmf_sdbrcm_clkctl(bus, CLK_SDONLY, false);
3372
3373         sdio_release_host(bus->sdiodev->func[1]);
3374
3375         return ret;
3376 }
3377
3378 static int brcmf_sdbrcm_bus_init(struct device *dev)
3379 {
3380         struct brcmf_bus *bus_if = dev_get_drvdata(dev);
3381         struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
3382         struct brcmf_sdio *bus = sdiodev->bus;
3383         unsigned long timeout;
3384         u8 ready, enable;
3385         int err, ret = 0;
3386         u8 saveclk;
3387
3388         brcmf_dbg(TRACE, "Enter\n");
3389
3390         /* try to download image and nvram to the dongle */
3391         if (bus_if->state == BRCMF_BUS_DOWN) {
3392                 if (!(brcmf_sdbrcm_download_firmware(bus)))
3393                         return -1;
3394         }
3395
3396         if (!bus->sdiodev->bus_if->drvr)
3397                 return 0;
3398
3399         /* Start the watchdog timer */
3400         bus->sdcnt.tickcnt = 0;
3401         brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS);
3402
3403         sdio_claim_host(bus->sdiodev->func[1]);
3404
3405         /* Make sure backplane clock is on, needed to generate F2 interrupt */
3406         brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false);
3407         if (bus->clkstate != CLK_AVAIL)
3408                 goto exit;
3409
3410         /* Force clocks on backplane to be sure F2 interrupt propagates */
3411         saveclk = brcmf_sdio_regrb(bus->sdiodev,
3412                                    SBSDIO_FUNC1_CHIPCLKCSR, &err);
3413         if (!err) {
3414                 brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
3415                                  (saveclk | SBSDIO_FORCE_HT), &err);
3416         }
3417         if (err) {
3418                 brcmf_err("Failed to force clock for F2: err %d\n", err);
3419                 goto exit;
3420         }
3421
3422         /* Enable function 2 (frame transfers) */
3423         w_sdreg32(bus, SDPCM_PROT_VERSION << SMB_DATA_VERSION_SHIFT,
3424                   offsetof(struct sdpcmd_regs, tosbmailboxdata));
3425         enable = (SDIO_FUNC_ENABLE_1 | SDIO_FUNC_ENABLE_2);
3426
3427         brcmf_sdio_regwb(bus->sdiodev, SDIO_CCCR_IOEx, enable, NULL);
3428
3429         timeout = jiffies + msecs_to_jiffies(BRCMF_WAIT_F2RDY);
3430         ready = 0;
3431         while (enable != ready) {
3432                 ready = brcmf_sdio_regrb(bus->sdiodev,
3433                                          SDIO_CCCR_IORx, NULL);
3434                 if (time_after(jiffies, timeout))
3435                         break;
3436                 else if (time_after(jiffies, timeout - BRCMF_WAIT_F2RDY + 50))
3437                         /* prevent busy waiting if it takes too long */
3438                         msleep_interruptible(20);
3439         }
3440
3441         brcmf_dbg(INFO, "enable 0x%02x, ready 0x%02x\n", enable, ready);
3442
3443         /* If F2 successfully enabled, set core and enable interrupts */
3444         if (ready == enable) {
3445                 /* Set up the interrupt mask and enable interrupts */
3446                 bus->hostintmask = HOSTINTMASK;
3447                 w_sdreg32(bus, bus->hostintmask,
3448                           offsetof(struct sdpcmd_regs, hostintmask));
3449
3450                 brcmf_sdio_regwb(bus->sdiodev, SBSDIO_WATERMARK, 8, &err);
3451         } else {
3452                 /* Disable F2 again */
3453                 enable = SDIO_FUNC_ENABLE_1;
3454                 brcmf_sdio_regwb(bus->sdiodev, SDIO_CCCR_IOEx, enable, NULL);
3455                 ret = -ENODEV;
3456         }
3457
3458         /* Restore previous clock setting */
3459         brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, saveclk, &err);
3460
3461         if (ret == 0) {
3462                 ret = brcmf_sdio_intr_register(bus->sdiodev);
3463                 if (ret != 0)
3464                         brcmf_err("intr register failed:%d\n", ret);
3465         }
3466
3467         /* If we didn't come up, turn off backplane clock */
3468         if (bus_if->state != BRCMF_BUS_DATA)
3469                 brcmf_sdbrcm_clkctl(bus, CLK_NONE, false);
3470
3471 exit:
3472         sdio_release_host(bus->sdiodev->func[1]);
3473
3474         return ret;
3475 }
3476
3477 void brcmf_sdbrcm_isr(void *arg)
3478 {
3479         struct brcmf_sdio *bus = (struct brcmf_sdio *) arg;
3480
3481         brcmf_dbg(TRACE, "Enter\n");
3482
3483         if (!bus) {
3484                 brcmf_err("bus is null pointer, exiting\n");
3485                 return;
3486         }
3487
3488         if (bus->sdiodev->bus_if->state == BRCMF_BUS_DOWN) {
3489                 brcmf_err("bus is down. we have nothing to do\n");
3490                 return;
3491         }
3492         /* Count the interrupt call */
3493         bus->sdcnt.intrcount++;
3494         if (in_interrupt())
3495                 atomic_set(&bus->ipend, 1);
3496         else
3497                 if (brcmf_sdio_intr_rstatus(bus)) {
3498                         brcmf_err("failed backplane access\n");
3499                         bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
3500                 }
3501
3502         /* Disable additional interrupts (is this needed now)? */
3503         if (!bus->intr)
3504                 brcmf_err("isr w/o interrupt configured!\n");
3505
3506         brcmf_sdbrcm_adddpctsk(bus);
3507         queue_work(bus->brcmf_wq, &bus->datawork);
3508 }
3509
3510 static bool brcmf_sdbrcm_bus_watchdog(struct brcmf_sdio *bus)
3511 {
3512 #ifdef DEBUG
3513         struct brcmf_bus *bus_if = dev_get_drvdata(bus->sdiodev->dev);
3514 #endif  /* DEBUG */
3515         unsigned long flags;
3516
3517         brcmf_dbg(TIMER, "Enter\n");
3518
3519         /* Poll period: check device if appropriate. */
3520         if (bus->poll && (++bus->polltick >= bus->pollrate)) {
3521                 u32 intstatus = 0;
3522
3523                 /* Reset poll tick */
3524                 bus->polltick = 0;
3525
3526                 /* Check device if no interrupts */
3527                 if (!bus->intr ||
3528                     (bus->sdcnt.intrcount == bus->sdcnt.lastintrs)) {
3529
3530                         spin_lock_irqsave(&bus->dpc_tl_lock, flags);
3531                         if (list_empty(&bus->dpc_tsklst)) {
3532                                 u8 devpend;
3533                                 spin_unlock_irqrestore(&bus->dpc_tl_lock,
3534                                                        flags);
3535                                 sdio_claim_host(bus->sdiodev->func[1]);
3536                                 devpend = brcmf_sdio_regrb(bus->sdiodev,
3537                                                            SDIO_CCCR_INTx,
3538                                                            NULL);
3539                                 sdio_release_host(bus->sdiodev->func[1]);
3540                                 intstatus =
3541                                     devpend & (INTR_STATUS_FUNC1 |
3542                                                INTR_STATUS_FUNC2);
3543                         } else {
3544                                 spin_unlock_irqrestore(&bus->dpc_tl_lock,
3545                                                        flags);
3546                         }
3547
3548                         /* If there is something, make like the ISR and
3549                                  schedule the DPC */
3550                         if (intstatus) {
3551                                 bus->sdcnt.pollcnt++;
3552                                 atomic_set(&bus->ipend, 1);
3553
3554                                 brcmf_sdbrcm_adddpctsk(bus);
3555                                 queue_work(bus->brcmf_wq, &bus->datawork);
3556                         }
3557                 }
3558
3559                 /* Update interrupt tracking */
3560                 bus->sdcnt.lastintrs = bus->sdcnt.intrcount;
3561         }
3562 #ifdef DEBUG
3563         /* Poll for console output periodically */
3564         if (bus_if && bus_if->state == BRCMF_BUS_DATA &&
3565             bus->console_interval != 0) {
3566                 bus->console.count += BRCMF_WD_POLL_MS;
3567                 if (bus->console.count >= bus->console_interval) {
3568                         bus->console.count -= bus->console_interval;
3569                         sdio_claim_host(bus->sdiodev->func[1]);
3570                         /* Make sure backplane clock is on */
3571                         brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false);
3572                         if (brcmf_sdbrcm_readconsole(bus) < 0)
3573                                 /* stop on error */
3574                                 bus->console_interval = 0;
3575                         sdio_release_host(bus->sdiodev->func[1]);
3576                 }
3577         }
3578 #endif                          /* DEBUG */
3579
3580         /* On idle timeout clear activity flag and/or turn off clock */
3581         if ((bus->idletime > 0) && (bus->clkstate == CLK_AVAIL)) {
3582                 if (++bus->idlecount >= bus->idletime) {
3583                         bus->idlecount = 0;
3584                         if (bus->activity) {
3585                                 bus->activity = false;
3586                                 brcmf_sdbrcm_wd_timer(bus, BRCMF_WD_POLL_MS);
3587                         } else {
3588                                 sdio_claim_host(bus->sdiodev->func[1]);
3589                                 brcmf_sdbrcm_clkctl(bus, CLK_NONE, false);
3590                                 sdio_release_host(bus->sdiodev->func[1]);
3591                         }
3592                 }
3593         }
3594
3595         return (atomic_read(&bus->ipend) > 0);
3596 }
3597
3598 static bool brcmf_sdbrcm_chipmatch(u16 chipid)
3599 {
3600         if (chipid == BCM43241_CHIP_ID)
3601                 return true;
3602         if (chipid == BCM4329_CHIP_ID)
3603                 return true;
3604         if (chipid == BCM4330_CHIP_ID)
3605                 return true;
3606         if (chipid == BCM4334_CHIP_ID)
3607                 return true;
3608         return false;
3609 }
3610
3611 static void brcmf_sdio_dataworker(struct work_struct *work)
3612 {
3613         struct brcmf_sdio *bus = container_of(work, struct brcmf_sdio,
3614                                               datawork);
3615         struct list_head *cur_hd, *tmp_hd;
3616         unsigned long flags;
3617
3618         spin_lock_irqsave(&bus->dpc_tl_lock, flags);
3619         list_for_each_safe(cur_hd, tmp_hd, &bus->dpc_tsklst) {
3620                 spin_unlock_irqrestore(&bus->dpc_tl_lock, flags);
3621
3622                 brcmf_sdbrcm_dpc(bus);
3623
3624                 spin_lock_irqsave(&bus->dpc_tl_lock, flags);
3625                 list_del(cur_hd);
3626                 kfree(cur_hd);
3627         }
3628         spin_unlock_irqrestore(&bus->dpc_tl_lock, flags);
3629 }
3630
3631 static void brcmf_sdbrcm_release_malloc(struct brcmf_sdio *bus)
3632 {
3633         brcmf_dbg(TRACE, "Enter\n");
3634
3635         kfree(bus->rxbuf);
3636         bus->rxctl = bus->rxbuf = NULL;
3637         bus->rxlen = 0;
3638
3639         kfree(bus->databuf);
3640         bus->databuf = NULL;
3641 }
3642
3643 static bool brcmf_sdbrcm_probe_malloc(struct brcmf_sdio *bus)
3644 {
3645         brcmf_dbg(TRACE, "Enter\n");
3646
3647         if (bus->sdiodev->bus_if->maxctl) {
3648                 bus->rxblen =
3649                     roundup((bus->sdiodev->bus_if->maxctl + SDPCM_HDRLEN),
3650                             ALIGNMENT) + BRCMF_SDALIGN;
3651                 bus->rxbuf = kmalloc(bus->rxblen, GFP_ATOMIC);
3652                 if (!(bus->rxbuf))
3653                         goto fail;
3654         }
3655
3656         /* Allocate buffer to receive glomed packet */
3657         bus->databuf = kmalloc(MAX_DATA_BUF, GFP_ATOMIC);
3658         if (!(bus->databuf)) {
3659                 /* release rxbuf which was already located as above */
3660                 if (!bus->rxblen)
3661                         kfree(bus->rxbuf);
3662                 goto fail;
3663         }
3664
3665         /* Align the buffer */
3666         if ((unsigned long)bus->databuf % BRCMF_SDALIGN)
3667                 bus->dataptr = bus->databuf + (BRCMF_SDALIGN -
3668                                ((unsigned long)bus->databuf % BRCMF_SDALIGN));
3669         else
3670                 bus->dataptr = bus->databuf;
3671
3672         return true;
3673
3674 fail:
3675         return false;
3676 }
3677
3678 static bool
3679 brcmf_sdbrcm_probe_attach(struct brcmf_sdio *bus, u32 regsva)
3680 {
3681         u8 clkctl = 0;
3682         int err = 0;
3683         int reg_addr;
3684         u32 reg_val;
3685         u8 idx;
3686
3687         bus->alp_only = true;
3688
3689         sdio_claim_host(bus->sdiodev->func[1]);
3690
3691         pr_debug("F1 signature read @0x18000000=0x%4x\n",
3692                  brcmf_sdio_regrl(bus->sdiodev, SI_ENUM_BASE, NULL));
3693
3694         /*
3695          * Force PLL off until brcmf_sdio_chip_attach()
3696          * programs PLL control regs
3697          */
3698
3699         brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
3700                          BRCMF_INIT_CLKCTL1, &err);
3701         if (!err)
3702                 clkctl = brcmf_sdio_regrb(bus->sdiodev,
3703                                           SBSDIO_FUNC1_CHIPCLKCSR, &err);
3704
3705         if (err || ((clkctl & ~SBSDIO_AVBITS) != BRCMF_INIT_CLKCTL1)) {
3706                 brcmf_err("ChipClkCSR access: err %d wrote 0x%02x read 0x%02x\n",
3707                           err, BRCMF_INIT_CLKCTL1, clkctl);
3708                 goto fail;
3709         }
3710
3711         if (brcmf_sdio_chip_attach(bus->sdiodev, &bus->ci, regsva)) {
3712                 brcmf_err("brcmf_sdio_chip_attach failed!\n");
3713                 goto fail;
3714         }
3715
3716         if (!brcmf_sdbrcm_chipmatch((u16) bus->ci->chip)) {
3717                 brcmf_err("unsupported chip: 0x%04x\n", bus->ci->chip);
3718                 goto fail;
3719         }
3720
3721         brcmf_sdio_chip_drivestrengthinit(bus->sdiodev, bus->ci,
3722                                           SDIO_DRIVE_STRENGTH);
3723
3724         /* Get info on the SOCRAM cores... */
3725         bus->ramsize = bus->ci->ramsize;
3726         if (!(bus->ramsize)) {
3727                 brcmf_err("failed to find SOCRAM memory!\n");
3728                 goto fail;
3729         }
3730
3731         /* Set core control so an SDIO reset does a backplane reset */
3732         idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV);
3733         reg_addr = bus->ci->c_inf[idx].base +
3734                    offsetof(struct sdpcmd_regs, corecontrol);
3735         reg_val = brcmf_sdio_regrl(bus->sdiodev, reg_addr, NULL);
3736         brcmf_sdio_regwl(bus->sdiodev, reg_addr, reg_val | CC_BPRESEN, NULL);
3737
3738         sdio_release_host(bus->sdiodev->func[1]);
3739
3740         brcmu_pktq_init(&bus->txq, (PRIOMASK + 1), TXQLEN);
3741
3742         /* Locate an appropriately-aligned portion of hdrbuf */
3743         bus->rxhdr = (u8 *) roundup((unsigned long)&bus->hdrbuf[0],
3744                                     BRCMF_SDALIGN);
3745
3746         /* Set the poll and/or interrupt flags */
3747         bus->intr = true;
3748         bus->poll = false;
3749         if (bus->poll)
3750                 bus->pollrate = 1;
3751
3752         return true;
3753
3754 fail:
3755         sdio_release_host(bus->sdiodev->func[1]);
3756         return false;
3757 }
3758
3759 static bool brcmf_sdbrcm_probe_init(struct brcmf_sdio *bus)
3760 {
3761         brcmf_dbg(TRACE, "Enter\n");
3762
3763         sdio_claim_host(bus->sdiodev->func[1]);
3764
3765         /* Disable F2 to clear any intermediate frame state on the dongle */
3766         brcmf_sdio_regwb(bus->sdiodev, SDIO_CCCR_IOEx,
3767                          SDIO_FUNC_ENABLE_1, NULL);
3768
3769         bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
3770         bus->rxflow = false;
3771
3772         /* Done with backplane-dependent accesses, can drop clock... */
3773         brcmf_sdio_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, 0, NULL);
3774
3775         sdio_release_host(bus->sdiodev->func[1]);
3776
3777         /* ...and initialize clock/power states */
3778         bus->clkstate = CLK_SDONLY;
3779         bus->idletime = BRCMF_IDLE_INTERVAL;
3780         bus->idleclock = BRCMF_IDLE_ACTIVE;
3781
3782         /* Query the F2 block size, set roundup accordingly */
3783         bus->blocksize = bus->sdiodev->func[2]->cur_blksize;
3784         bus->roundup = min(max_roundup, bus->blocksize);
3785
3786         /* bus module does not support packet chaining */
3787         bus->use_rxchain = false;
3788         bus->sd_rxchain = false;
3789
3790         return true;
3791 }
3792
3793 static int
3794 brcmf_sdbrcm_watchdog_thread(void *data)
3795 {
3796         struct brcmf_sdio *bus = (struct brcmf_sdio *)data;
3797
3798         allow_signal(SIGTERM);
3799         /* Run until signal received */
3800         while (1) {
3801                 if (kthread_should_stop())
3802                         break;
3803                 if (!wait_for_completion_interruptible(&bus->watchdog_wait)) {
3804                         brcmf_sdbrcm_bus_watchdog(bus);
3805                         /* Count the tick for reference */
3806                         bus->sdcnt.tickcnt++;
3807                 } else
3808                         break;
3809         }
3810         return 0;
3811 }
3812
3813 static void
3814 brcmf_sdbrcm_watchdog(unsigned long data)
3815 {
3816         struct brcmf_sdio *bus = (struct brcmf_sdio *)data;
3817
3818         if (bus->watchdog_tsk) {
3819                 complete(&bus->watchdog_wait);
3820                 /* Reschedule the watchdog */
3821                 if (bus->wd_timer_valid)
3822                         mod_timer(&bus->timer,
3823                                   jiffies + BRCMF_WD_POLL_MS * HZ / 1000);
3824         }
3825 }
3826
3827 static void brcmf_sdbrcm_release_dongle(struct brcmf_sdio *bus)
3828 {
3829         brcmf_dbg(TRACE, "Enter\n");
3830
3831         if (bus->ci) {
3832                 sdio_claim_host(bus->sdiodev->func[1]);
3833                 brcmf_sdbrcm_clkctl(bus, CLK_AVAIL, false);
3834                 brcmf_sdbrcm_clkctl(bus, CLK_NONE, false);
3835                 sdio_release_host(bus->sdiodev->func[1]);
3836                 brcmf_sdio_chip_detach(&bus->ci);
3837                 if (bus->vars && bus->varsz)
3838                         kfree(bus->vars);
3839                 bus->vars = NULL;
3840         }
3841
3842         brcmf_dbg(TRACE, "Disconnected\n");
3843 }
3844
3845 /* Detach and free everything */
3846 static void brcmf_sdbrcm_release(struct brcmf_sdio *bus)
3847 {
3848         brcmf_dbg(TRACE, "Enter\n");
3849
3850         if (bus) {
3851                 /* De-register interrupt handler */
3852                 brcmf_sdio_intr_unregister(bus->sdiodev);
3853
3854                 cancel_work_sync(&bus->datawork);
3855                 if (bus->brcmf_wq)
3856                         destroy_workqueue(bus->brcmf_wq);
3857
3858                 if (bus->sdiodev->bus_if->drvr) {
3859                         brcmf_detach(bus->sdiodev->dev);
3860                         brcmf_sdbrcm_release_dongle(bus);
3861                 }
3862
3863                 brcmf_sdbrcm_release_malloc(bus);
3864
3865                 kfree(bus);
3866         }
3867
3868         brcmf_dbg(TRACE, "Disconnected\n");
3869 }
3870
3871 static struct brcmf_bus_ops brcmf_sdio_bus_ops = {
3872         .stop = brcmf_sdbrcm_bus_stop,
3873         .init = brcmf_sdbrcm_bus_init,
3874         .txdata = brcmf_sdbrcm_bus_txdata,
3875         .txctl = brcmf_sdbrcm_bus_txctl,
3876         .rxctl = brcmf_sdbrcm_bus_rxctl,
3877 };
3878
3879 void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev)
3880 {
3881         int ret;
3882         struct brcmf_sdio *bus;
3883         struct brcmf_bus_dcmd *dlst;
3884         u32 dngl_txglom;
3885         u32 dngl_txglomalign;
3886         u8 idx;
3887
3888         brcmf_dbg(TRACE, "Enter\n");
3889
3890         /* We make an assumption about address window mappings:
3891          * regsva == SI_ENUM_BASE*/
3892
3893         /* Allocate private bus interface state */
3894         bus = kzalloc(sizeof(struct brcmf_sdio), GFP_ATOMIC);
3895         if (!bus)
3896                 goto fail;
3897
3898         bus->sdiodev = sdiodev;
3899         sdiodev->bus = bus;
3900         skb_queue_head_init(&bus->glom);
3901         bus->txbound = BRCMF_TXBOUND;
3902         bus->rxbound = BRCMF_RXBOUND;
3903         bus->txminmax = BRCMF_TXMINMAX;
3904         bus->tx_seq = SDPCM_SEQUENCE_WRAP - 1;
3905
3906         INIT_WORK(&bus->datawork, brcmf_sdio_dataworker);
3907         bus->brcmf_wq = create_singlethread_workqueue("brcmf_wq");
3908         if (bus->brcmf_wq == NULL) {
3909                 brcmf_err("insufficient memory to create txworkqueue\n");
3910                 goto fail;
3911         }
3912
3913         /* attempt to attach to the dongle */
3914         if (!(brcmf_sdbrcm_probe_attach(bus, regsva))) {
3915                 brcmf_err("brcmf_sdbrcm_probe_attach failed\n");
3916                 goto fail;
3917         }
3918
3919         spin_lock_init(&bus->rxctl_lock);
3920         spin_lock_init(&bus->txqlock);
3921         init_waitqueue_head(&bus->ctrl_wait);
3922         init_waitqueue_head(&bus->dcmd_resp_wait);
3923
3924         /* Set up the watchdog timer */
3925         init_timer(&bus->timer);
3926         bus->timer.data = (unsigned long)bus;
3927         bus->timer.function = brcmf_sdbrcm_watchdog;
3928
3929         /* Initialize watchdog thread */
3930         init_completion(&bus->watchdog_wait);
3931         bus->watchdog_tsk = kthread_run(brcmf_sdbrcm_watchdog_thread,
3932                                         bus, "brcmf_watchdog");
3933         if (IS_ERR(bus->watchdog_tsk)) {
3934                 pr_warn("brcmf_watchdog thread failed to start\n");
3935                 bus->watchdog_tsk = NULL;
3936         }
3937         /* Initialize DPC thread */
3938         INIT_LIST_HEAD(&bus->dpc_tsklst);
3939         spin_lock_init(&bus->dpc_tl_lock);
3940
3941         /* Assign bus interface call back */
3942         bus->sdiodev->bus_if->dev = bus->sdiodev->dev;
3943         bus->sdiodev->bus_if->ops = &brcmf_sdio_bus_ops;
3944
3945         /* Attach to the brcmf/OS/network interface */
3946         ret = brcmf_attach(SDPCM_RESERVE, bus->sdiodev->dev);
3947         if (ret != 0) {
3948                 brcmf_err("brcmf_attach failed\n");
3949                 goto fail;
3950         }
3951
3952         /* Allocate buffers */
3953         if (!(brcmf_sdbrcm_probe_malloc(bus))) {
3954                 brcmf_err("brcmf_sdbrcm_probe_malloc failed\n");
3955                 goto fail;
3956         }
3957
3958         if (!(brcmf_sdbrcm_probe_init(bus))) {
3959                 brcmf_err("brcmf_sdbrcm_probe_init failed\n");
3960                 goto fail;
3961         }
3962
3963         brcmf_sdio_debugfs_create(bus);
3964         brcmf_dbg(INFO, "completed!!\n");
3965
3966         /* sdio bus core specific dcmd */
3967         idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV);
3968         dlst = kzalloc(sizeof(struct brcmf_bus_dcmd), GFP_KERNEL);
3969         if (dlst) {
3970                 if (bus->ci->c_inf[idx].rev < 12) {
3971                         /* for sdio core rev < 12, disable txgloming */
3972                         dngl_txglom = 0;
3973                         dlst->name = "bus:txglom";
3974                         dlst->param = (char *)&dngl_txglom;
3975                         dlst->param_len = sizeof(u32);
3976                 } else {
3977                         /* otherwise, set txglomalign */
3978                         dngl_txglomalign = bus->sdiodev->bus_if->align;
3979                         dlst->name = "bus:txglomalign";
3980                         dlst->param = (char *)&dngl_txglomalign;
3981                         dlst->param_len = sizeof(u32);
3982                 }
3983                 list_add(&dlst->list, &bus->sdiodev->bus_if->dcmd_list);
3984         }
3985
3986         /* if firmware path present try to download and bring up bus */
3987         ret = brcmf_bus_start(bus->sdiodev->dev);
3988         if (ret != 0) {
3989                 brcmf_err("dongle is not responding\n");
3990                 goto fail;
3991         }
3992
3993         return bus;
3994
3995 fail:
3996         brcmf_sdbrcm_release(bus);
3997         return NULL;
3998 }
3999
4000 void brcmf_sdbrcm_disconnect(void *ptr)
4001 {
4002         struct brcmf_sdio *bus = (struct brcmf_sdio *)ptr;
4003
4004         brcmf_dbg(TRACE, "Enter\n");
4005
4006         if (bus)
4007                 brcmf_sdbrcm_release(bus);
4008
4009         brcmf_dbg(TRACE, "Disconnected\n");
4010 }
4011
4012 void
4013 brcmf_sdbrcm_wd_timer(struct brcmf_sdio *bus, uint wdtick)
4014 {
4015         /* Totally stop the timer */
4016         if (!wdtick && bus->wd_timer_valid) {
4017                 del_timer_sync(&bus->timer);
4018                 bus->wd_timer_valid = false;
4019                 bus->save_ms = wdtick;
4020                 return;
4021         }
4022
4023         /* don't start the wd until fw is loaded */
4024         if (bus->sdiodev->bus_if->state == BRCMF_BUS_DOWN)
4025                 return;
4026
4027         if (wdtick) {
4028                 if (bus->save_ms != BRCMF_WD_POLL_MS) {
4029                         if (bus->wd_timer_valid)
4030                                 /* Stop timer and restart at new value */
4031                                 del_timer_sync(&bus->timer);
4032
4033                         /* Create timer again when watchdog period is
4034                            dynamically changed or in the first instance
4035                          */
4036                         bus->timer.expires =
4037                                 jiffies + BRCMF_WD_POLL_MS * HZ / 1000;
4038                         add_timer(&bus->timer);
4039
4040                 } else {
4041                         /* Re arm the timer, at last watchdog period */
4042                         mod_timer(&bus->timer,
4043                                 jiffies + BRCMF_WD_POLL_MS * HZ / 1000);
4044                 }
4045
4046                 bus->wd_timer_valid = true;
4047                 bus->save_ms = wdtick;
4048         }
4049 }