dhd_sdio.c 109.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/*
 * Copyright (c) 2010 Broadcom Corporation
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/kthread.h>
#include <linux/printk.h>
#include <linux/pci_ids.h>
#include <linux/netdevice.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <linux/mmc/sdio.h>
#include <linux/mmc/sdio_func.h>
#include <linux/mmc/card.h>
#include <linux/semaphore.h>
#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 <linux/platform_data/brcmfmac-sdio.h>
35
#include <linux/moduleparam.h>
36 37 38 39 40 41 42
#include <asm/unaligned.h>
#include <defs.h>
#include <brcmu_wifi.h>
#include <brcmu_utils.h>
#include <brcm_hw_ids.h>
#include <soc.h>
#include "sdio_host.h"
43
#include "sdio_chip.h"
44 45 46

#define DCMD_RESP_TIMEOUT  2000	/* In milli second */

J
Joe Perches 已提交
47
#ifdef DEBUG
48 49 50 51 52

#define BRCMF_TRAP_INFO_SIZE	80

#define CBUF_LEN	(128)

53 54 55
/* Device console log buffer state */
#define CONSOLE_BUFFER_MAX	2024

56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
struct rte_log_le {
	__le32 buf;		/* Can't be pointer on (64-bit) hosts */
	__le32 buf_size;
	__le32 idx;
	char *_buf_compat;	/* Redundant pointer for backward compat. */
};

struct rte_console {
	/* Virtual UART
	 * When there is no UART (e.g. Quickturn),
	 * the host should write a complete
	 * input line directly into cbuf and then write
	 * the length into vcons_in.
	 * This may also be used when there is a real UART
	 * (at risk of conflicting with
	 * the real UART).  vcons_out is currently unused.
	 */
	uint vcons_in;
	uint vcons_out;

	/* Output (logging) buffer
	 * Console output is written to a ring buffer log_buf at index log_idx.
	 * The host may read the output when it sees log_idx advance.
	 * Output will be lost if the output wraps around faster than the host
	 * polls.
	 */
	struct rte_log_le log_le;

	/* Console input line buffer
	 * Characters are read one at a time into cbuf
	 * until <CR> is received, then
	 * the buffer is processed as a command line.
	 * Also used for virtual UART.
	 */
	uint cbuf_idx;
	char cbuf[CBUF_LEN];
};

J
Joe Perches 已提交
94
#endif				/* DEBUG */
95 96 97 98
#include <chipcommon.h>

#include "dhd_bus.h"
#include "dhd_dbg.h"
99
#include "tracepoint.h"
100 101 102 103 104 105 106 107 108 109 110 111 112 113

#define TXQLEN		2048	/* bulk tx queue length */
#define TXHI		(TXQLEN - 256)	/* turn on flow control above TXHI */
#define TXLOW		(TXHI - 256)	/* turn off flow control below TXLOW */
#define PRIOMASK	7

#define TXRETRIES	2	/* # of retries for tx frames */

#define BRCMF_RXBOUND	50	/* Default for max rx frames in
				 one scheduling */

#define BRCMF_TXBOUND	20	/* Default for max tx frames in
				 one scheduling */

114 115
#define BRCMF_DEFAULT_TXGLOM_SIZE	32  /* max tx frames in glom chain */

116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
#define BRCMF_TXMINMAX	1	/* Max tx frames if rx still pending */

#define MEMBLOCK	2048	/* Block size used for downloading
				 of dongle image */
#define MAX_DATA_BUF	(32 * 1024)	/* Must be large enough to hold
				 biggest possible glom */

#define BRCMF_FIRSTREAD	(1 << 6)


/* SBSDIO_DEVICE_CTL */

/* 1: device will assert busy signal when receiving CMD53 */
#define SBSDIO_DEVCTL_SETBUSY		0x01
/* 1: assertion of sdio interrupt is synchronous to the sdio clock */
#define SBSDIO_DEVCTL_SPI_INTR_SYNC	0x02
/* 1: mask all interrupts to host except the chipActive (rev 8) */
#define SBSDIO_DEVCTL_CA_INT_ONLY	0x04
/* 1: isolate internal sdio signals, put external pads in tri-state; requires
 * sdio bus power cycle to clear (rev 9) */
#define SBSDIO_DEVCTL_PADS_ISO		0x08
/* Force SD->SB reset mapping (rev 11) */
#define SBSDIO_DEVCTL_SB_RST_CTL	0x30
/*   Determined by CoreControl bit */
#define SBSDIO_DEVCTL_RST_CORECTL	0x00
/*   Force backplane reset */
#define SBSDIO_DEVCTL_RST_BPRESET	0x10
/*   Force no backplane reset */
#define SBSDIO_DEVCTL_RST_NOBPRESET	0x20

/* direct(mapped) cis space */

/* MAPPED common CIS address */
#define SBSDIO_CIS_BASE_COMMON		0x1000
/* maximum bytes in one CIS */
#define SBSDIO_CIS_SIZE_LIMIT		0x200
/* cis offset addr is < 17 bits */
#define SBSDIO_CIS_OFT_ADDR_MASK	0x1FFFF

/* manfid tuple length, include tuple, link bytes */
#define SBSDIO_CIS_MANFID_TUPLE_LEN	6

/* intstatus */
#define I_SMB_SW0	(1 << 0)	/* To SB Mail S/W interrupt 0 */
#define I_SMB_SW1	(1 << 1)	/* To SB Mail S/W interrupt 1 */
#define I_SMB_SW2	(1 << 2)	/* To SB Mail S/W interrupt 2 */
#define I_SMB_SW3	(1 << 3)	/* To SB Mail S/W interrupt 3 */
#define I_SMB_SW_MASK	0x0000000f	/* To SB Mail S/W interrupts mask */
#define I_SMB_SW_SHIFT	0	/* To SB Mail S/W interrupts shift */
#define I_HMB_SW0	(1 << 4)	/* To Host Mail S/W interrupt 0 */
#define I_HMB_SW1	(1 << 5)	/* To Host Mail S/W interrupt 1 */
#define I_HMB_SW2	(1 << 6)	/* To Host Mail S/W interrupt 2 */
#define I_HMB_SW3	(1 << 7)	/* To Host Mail S/W interrupt 3 */
#define I_HMB_SW_MASK	0x000000f0	/* To Host Mail S/W interrupts mask */
#define I_HMB_SW_SHIFT	4	/* To Host Mail S/W interrupts shift */
#define I_WR_OOSYNC	(1 << 8)	/* Write Frame Out Of Sync */
#define I_RD_OOSYNC	(1 << 9)	/* Read Frame Out Of Sync */
#define	I_PC		(1 << 10)	/* descriptor error */
#define	I_PD		(1 << 11)	/* data error */
#define	I_DE		(1 << 12)	/* Descriptor protocol Error */
#define	I_RU		(1 << 13)	/* Receive descriptor Underflow */
#define	I_RO		(1 << 14)	/* Receive fifo Overflow */
#define	I_XU		(1 << 15)	/* Transmit fifo Underflow */
#define	I_RI		(1 << 16)	/* Receive Interrupt */
#define I_BUSPWR	(1 << 17)	/* SDIO Bus Power Change (rev 9) */
#define I_XMTDATA_AVAIL (1 << 23)	/* bits in fifo */
#define	I_XI		(1 << 24)	/* Transmit Interrupt */
#define I_RF_TERM	(1 << 25)	/* Read Frame Terminate */
#define I_WF_TERM	(1 << 26)	/* Write Frame Terminate */
#define I_PCMCIA_XU	(1 << 27)	/* PCMCIA Transmit FIFO Underflow */
#define I_SBINT		(1 << 28)	/* sbintstatus Interrupt */
#define I_CHIPACTIVE	(1 << 29)	/* chip from doze to active state */
#define I_SRESET	(1 << 30)	/* CCCR RES interrupt */
#define I_IOE2		(1U << 31)	/* CCCR IOE2 Bit Changed */
#define	I_ERRORS	(I_PC | I_PD | I_DE | I_RU | I_RO | I_XU)
#define I_DMA		(I_RI | I_XI | I_ERRORS)

/* corecontrol */
#define CC_CISRDY		(1 << 0)	/* CIS Ready */
#define CC_BPRESEN		(1 << 1)	/* CCCR RES signal */
#define CC_F2RDY		(1 << 2)	/* set CCCR IOR2 bit */
#define CC_CLRPADSISO		(1 << 3)	/* clear SDIO pads isolation */
#define CC_XMTDATAAVAIL_MODE	(1 << 4)
#define CC_XMTDATAAVAIL_CTRL	(1 << 5)

/* SDA_FRAMECTRL */
#define SFC_RF_TERM	(1 << 0)	/* Read Frame Terminate */
#define SFC_WF_TERM	(1 << 1)	/* Write Frame Terminate */
#define SFC_CRC4WOOS	(1 << 2)	/* CRC error for write out of sync */
#define SFC_ABORTALL	(1 << 3)	/* Abort all in-progress frames */

/*
 * Software allocation of To SB Mailbox resources
 */

/* tosbmailbox bits corresponding to intstatus bits */
#define SMB_NAK		(1 << 0)	/* Frame NAK */
#define SMB_INT_ACK	(1 << 1)	/* Host Interrupt ACK */
#define SMB_USE_OOB	(1 << 2)	/* Use OOB Wakeup */
#define SMB_DEV_INT	(1 << 3)	/* Miscellaneous Interrupt */

/* tosbmailboxdata */
#define SMB_DATA_VERSION_SHIFT	16	/* host protocol version */

/*
 * Software allocation of To Host Mailbox resources
 */

/* intstatus bits */
#define I_HMB_FC_STATE	I_HMB_SW0	/* Flow Control State */
#define I_HMB_FC_CHANGE	I_HMB_SW1	/* Flow Control State Changed */
#define I_HMB_FRAME_IND	I_HMB_SW2	/* Frame Indication */
#define I_HMB_HOST_INT	I_HMB_SW3	/* Miscellaneous Interrupt */

/* tohostmailboxdata */
#define HMB_DATA_NAKHANDLED	1	/* retransmit NAK'd frame */
#define HMB_DATA_DEVREADY	2	/* talk to host after enable */
#define HMB_DATA_FC		4	/* per prio flowcontrol update flag */
#define HMB_DATA_FWREADY	8	/* fw ready for protocol activity */

#define HMB_DATA_FCDATA_MASK	0xff000000
#define HMB_DATA_FCDATA_SHIFT	24

#define HMB_DATA_VERSION_MASK	0x00ff0000
#define HMB_DATA_VERSION_SHIFT	16

/*
 * Software-defined protocol header
 */

/* Current protocol version */
#define SDPCM_PROT_VERSION	4

/*
 * Shared structure between dongle and the host.
 * The structure contains pointers to trap or assert information.
 */
253
#define SDPCM_SHARED_VERSION       0x0003
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
#define SDPCM_SHARED_VERSION_MASK  0x00FF
#define SDPCM_SHARED_ASSERT_BUILT  0x0100
#define SDPCM_SHARED_ASSERT        0x0200
#define SDPCM_SHARED_TRAP          0x0400

/* Space for header read, limit for data packets */
#define MAX_HDR_READ	(1 << 6)
#define MAX_RX_DATASZ	2048

/* Bump up limit on waiting for HT to account for first startup;
 * if the image is doing a CRC calculation before programming the PMU
 * for HT availability, it could take a couple hundred ms more, so
 * max out at a 1 second (1000000us).
 */
#undef PMU_MAX_TRANSITION_DLY
#define PMU_MAX_TRANSITION_DLY 1000000

/* Value for ChipClockCSR during initial setup */
#define BRCMF_INIT_CLKCTL1	(SBSDIO_FORCE_HW_CLKREQ_OFF |	\
					SBSDIO_ALP_AVAIL_REQ)

/* Flags for SDH calls */
#define F2SYNC	(SDIO_REQ_4BYTE | SDIO_REQ_FIXED)

278 279 280 281 282 283
#define BRCMF_IDLE_IMMEDIATE	(-1)	/* Enter idle immediately */
#define BRCMF_IDLE_ACTIVE	0	/* Do not request any SD clock change
					 * when idle
					 */
#define BRCMF_IDLE_INTERVAL	1

284 285 286
#define KSO_WAIT_US 50
#define MAX_KSO_ATTEMPTS (PMU_MAX_TRANSITION_DLY/KSO_WAIT_US)

287 288 289 290 291 292 293 294 295
/*
 * Conversion of 802.1D priority to precedence level
 */
static uint prio2prec(u32 prio)
{
	return (prio == PRIO_8021D_NONE || prio == PRIO_8021D_BE) ?
	       (prio^2) : prio;
}

J
Joe Perches 已提交
296
#ifdef DEBUG
297 298 299 300 301 302 303 304 305
/* Device console log buffer state */
struct brcmf_console {
	uint count;		/* Poll interval msec counter */
	uint log_addr;		/* Log struct address (fixed) */
	struct rte_log_le log_le;	/* Log struct (host copy) */
	uint bufsize;		/* Size of log buffer */
	u8 *buf;		/* Log buffer (host copy) */
	uint last;		/* Last buffer read index */
};
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328

struct brcmf_trap_info {
	__le32		type;
	__le32		epc;
	__le32		cpsr;
	__le32		spsr;
	__le32		r0;	/* a1 */
	__le32		r1;	/* a2 */
	__le32		r2;	/* a3 */
	__le32		r3;	/* a4 */
	__le32		r4;	/* v1 */
	__le32		r5;	/* v2 */
	__le32		r6;	/* v3 */
	__le32		r7;	/* v4 */
	__le32		r8;	/* v5 */
	__le32		r9;	/* sb/v6 */
	__le32		r10;	/* sl/v7 */
	__le32		r11;	/* fp/v8 */
	__le32		r12;	/* ip */
	__le32		r13;	/* sp */
	__le32		r14;	/* lr */
	__le32		pc;	/* r15 */
};
J
Joe Perches 已提交
329
#endif				/* DEBUG */
330 331 332 333 334 335 336 337 338 339

struct sdpcm_shared {
	u32 flags;
	u32 trap_addr;
	u32 assert_exp_addr;
	u32 assert_file_addr;
	u32 assert_line;
	u32 console_addr;	/* Address of struct rte_console */
	u32 msgtrace_addr;
	u8 tag[32];
340
	u32 brpt_addr;
341 342 343 344 345 346 347 348 349 350 351
};

struct sdpcm_shared_le {
	__le32 flags;
	__le32 trap_addr;
	__le32 assert_exp_addr;
	__le32 assert_file_addr;
	__le32 assert_line;
	__le32 console_addr;	/* Address of struct rte_console */
	__le32 msgtrace_addr;
	u8 tag[32];
352
	__le32 brpt_addr;
353 354
};

355 356
/* dongle SDIO bus specific header info */
struct brcmf_sdio_hdrinfo {
357 358 359 360 361 362
	u8 seq_num;
	u8 channel;
	u16 len;
	u16 len_left;
	u16 len_nxtfrm;
	u8 dat_offset;
363 364
	bool lastfrm;
	u16 tail_pad;
365
};
366 367 368

/* misc chip info needed by some of the routines */
/* Private data for SDIO bus interaction */
369
struct brcmf_sdio {
370 371 372 373 374 375 376 377
	struct brcmf_sdio_dev *sdiodev;	/* sdio device handler */
	struct chip_info *ci;	/* Chip info struct */
	char *vars;		/* Variables (from CIS and/or other) */
	uint varsz;		/* Size of variables buffer */

	u32 ramsize;		/* Size of RAM in SOCRAM (bytes) */

	u32 hostintmask;	/* Copy of Host Interrupt Mask */
378 379
	atomic_t intstatus;	/* Intstatus bits (events) pending */
	atomic_t fcstate;	/* State of dongle flow-control */
380 381 382 383 384 385 386 387 388

	uint blocksize;		/* Block size of SDIO transfers */
	uint roundup;		/* Max roundup limit */

	struct pktq txq;	/* Queue length used for flow-control */
	u8 flowcontrol;	/* per prio flow control bitmask */
	u8 tx_seq;		/* Transmit sequence number (next) */
	u8 tx_max;		/* Maximum transmit sequence allowed */

389
	u8 *hdrbuf;		/* buffer for handling rx frame */
390 391
	u8 *rxhdr;		/* Header of current rx frame (in hdrbuf) */
	u8 rx_seq;		/* Receive sequence number (expected) */
392
	struct brcmf_sdio_hdrinfo cur_read;
393
				/* info of current read frame */
394
	bool rxskip;		/* Skip receive (awaiting NAK ACK) */
395
	bool rxpending;		/* Data frame pending in dongle */
396 397 398 399 400 401

	uint rxbound;		/* Rx frames to read before resched */
	uint txbound;		/* Tx frames to send before resched */
	uint txminmax;

	struct sk_buff *glomd;	/* Packet containing glomming descriptor */
402
	struct sk_buff_head glom; /* Packet list for glommed superframe */
403 404 405 406 407
	uint glomerr;		/* Glom packet read errors */

	u8 *rxbuf;		/* Buffer for receiving control packets */
	uint rxblen;		/* Allocated length of rxbuf */
	u8 *rxctl;		/* Aligned pointer into rxbuf */
408
	u8 *rxctl_orig;		/* pointer for freeing rxctl */
409
	uint rxlen;		/* Length of valid data in buffer */
410
	spinlock_t rxctl_lock;	/* protection lock for ctrl frame resources */
411 412 413 414 415

	u8 sdpcm_ver;	/* Bus protocol reported by dongle */

	bool intr;		/* Use interrupts */
	bool poll;		/* Use polling */
416
	atomic_t ipend;		/* Device interrupt is pending */
417 418 419 420
	uint spurious;		/* Count of spurious interrupts */
	uint pollrate;		/* Ticks between device polls */
	uint polltick;		/* Tick counter */

J
Joe Perches 已提交
421
#ifdef DEBUG
422 423 424
	uint console_interval;
	struct brcmf_console console;	/* Console output polling support */
	uint console_addr;	/* Console address from shared struct */
J
Joe Perches 已提交
425
#endif				/* DEBUG */
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449

	uint clkstate;		/* State of sd and backplane clock(s) */
	bool activity;		/* Activity flag for clock down */
	s32 idletime;		/* Control for activity timeout */
	s32 idlecount;	/* Activity timeout counter */
	s32 idleclock;	/* How to set bus driver when idle */
	bool rxflow_mode;	/* Rx flow control mode */
	bool rxflow;		/* Is rx flow control on */
	bool alp_only;		/* Don't use HT clock (ALP only) */

	u8 *ctrl_frame_buf;
	u32 ctrl_frame_len;
	bool ctrl_frame_stat;

	spinlock_t txqlock;
	wait_queue_head_t ctrl_wait;
	wait_queue_head_t dcmd_resp_wait;

	struct timer_list timer;
	struct completion watchdog_wait;
	struct task_struct *watchdog_tsk;
	bool wd_timer_valid;
	uint save_ms;

450 451
	struct workqueue_struct *brcmf_wq;
	struct work_struct datawork;
452
	atomic_t dpc_tskcnt;
453

454
	bool txoff;		/* Transmit flow-controlled */
455
	struct brcmf_sdio_count sdcnt;
456 457
	bool sr_enabled; /* SaveRestore enabled */
	bool sleeping; /* SDIO bus sleeping */
458 459

	u8 tx_hdrlen;		/* sdio bus header length for tx packet */
460 461
	bool txglom;		/* host tx glomming enable flag */
	struct sk_buff *txglom_sgpad;	/* scatter-gather padding buffer */
462 463
	u16 head_align;		/* buffer pointer alignment */
	u16 sgentry_align;	/* scatter-gather buffer alignment */
464 465 466 467 468
};

/* clkstate */
#define CLK_NONE	0
#define CLK_SDONLY	1
469
#define CLK_PENDING	2
470 471
#define CLK_AVAIL	3

J
Joe Perches 已提交
472
#ifdef DEBUG
473
static int qcount[NUMPRIO];
J
Joe Perches 已提交
474
#endif				/* DEBUG */
475

476
#define DEFAULT_SDIO_DRIVE_STRENGTH	6	/* in milliamps */
477 478 479 480 481 482 483 484 485 486 487

#define RETRYCHAN(chan) ((chan) == SDPCM_EVENT_CHANNEL)

/* Retry count for register access failures */
static const uint retry_limit = 2;

/* Limit on rounding up frames */
static const uint max_roundup = 512;

#define ALIGNMENT  4

488 489 490 491
static int brcmf_sdio_txglomsz = BRCMF_DEFAULT_TXGLOM_SIZE;
module_param_named(txglomsz, brcmf_sdio_txglomsz, int, 0);
MODULE_PARM_DESC(txglomsz, "maximum tx packet chain size [SDIO]");

492 493 494 495 496 497
enum brcmf_sdio_frmtype {
	BRCMF_SDIO_FT_NORMAL,
	BRCMF_SDIO_FT_SUPER,
	BRCMF_SDIO_FT_SUB,
};

498 499 500 501 502 503 504 505 506 507 508 509 510 511
#define BCM43143_FIRMWARE_NAME		"brcm/brcmfmac43143-sdio.bin"
#define BCM43143_NVRAM_NAME		"brcm/brcmfmac43143-sdio.txt"
#define BCM43241B0_FIRMWARE_NAME	"brcm/brcmfmac43241b0-sdio.bin"
#define BCM43241B0_NVRAM_NAME		"brcm/brcmfmac43241b0-sdio.txt"
#define BCM43241B4_FIRMWARE_NAME	"brcm/brcmfmac43241b4-sdio.bin"
#define BCM43241B4_NVRAM_NAME		"brcm/brcmfmac43241b4-sdio.txt"
#define BCM4329_FIRMWARE_NAME		"brcm/brcmfmac4329-sdio.bin"
#define BCM4329_NVRAM_NAME		"brcm/brcmfmac4329-sdio.txt"
#define BCM4330_FIRMWARE_NAME		"brcm/brcmfmac4330-sdio.bin"
#define BCM4330_NVRAM_NAME		"brcm/brcmfmac4330-sdio.txt"
#define BCM4334_FIRMWARE_NAME		"brcm/brcmfmac4334-sdio.bin"
#define BCM4334_NVRAM_NAME		"brcm/brcmfmac4334-sdio.txt"
#define BCM4335_FIRMWARE_NAME		"brcm/brcmfmac4335-sdio.bin"
#define BCM4335_NVRAM_NAME		"brcm/brcmfmac4335-sdio.txt"
512 513
#define BCM43362_FIRMWARE_NAME		"brcm/brcmfmac43362-sdio.bin"
#define BCM43362_NVRAM_NAME		"brcm/brcmfmac43362-sdio.txt"
514 515
#define BCM4339_FIRMWARE_NAME		"brcm/brcmfmac4339-sdio.bin"
#define BCM4339_NVRAM_NAME		"brcm/brcmfmac4339-sdio.txt"
516 517 518 519 520 521 522 523 524 525 526 527 528 529 530

MODULE_FIRMWARE(BCM43143_FIRMWARE_NAME);
MODULE_FIRMWARE(BCM43143_NVRAM_NAME);
MODULE_FIRMWARE(BCM43241B0_FIRMWARE_NAME);
MODULE_FIRMWARE(BCM43241B0_NVRAM_NAME);
MODULE_FIRMWARE(BCM43241B4_FIRMWARE_NAME);
MODULE_FIRMWARE(BCM43241B4_NVRAM_NAME);
MODULE_FIRMWARE(BCM4329_FIRMWARE_NAME);
MODULE_FIRMWARE(BCM4329_NVRAM_NAME);
MODULE_FIRMWARE(BCM4330_FIRMWARE_NAME);
MODULE_FIRMWARE(BCM4330_NVRAM_NAME);
MODULE_FIRMWARE(BCM4334_FIRMWARE_NAME);
MODULE_FIRMWARE(BCM4334_NVRAM_NAME);
MODULE_FIRMWARE(BCM4335_FIRMWARE_NAME);
MODULE_FIRMWARE(BCM4335_NVRAM_NAME);
531 532
MODULE_FIRMWARE(BCM43362_FIRMWARE_NAME);
MODULE_FIRMWARE(BCM43362_NVRAM_NAME);
533 534
MODULE_FIRMWARE(BCM4339_FIRMWARE_NAME);
MODULE_FIRMWARE(BCM4339_NVRAM_NAME);
535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557

struct brcmf_firmware_names {
	u32 chipid;
	u32 revmsk;
	const char *bin;
	const char *nv;
};

enum brcmf_firmware_type {
	BRCMF_FIRMWARE_BIN,
	BRCMF_FIRMWARE_NVRAM
};

#define BRCMF_FIRMWARE_NVRAM(name) \
	name ## _FIRMWARE_NAME, name ## _NVRAM_NAME

static const struct brcmf_firmware_names brcmf_fwname_data[] = {
	{ BCM43143_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM43143) },
	{ BCM43241_CHIP_ID, 0x0000001F, BRCMF_FIRMWARE_NVRAM(BCM43241B0) },
	{ BCM43241_CHIP_ID, 0xFFFFFFE0, BRCMF_FIRMWARE_NVRAM(BCM43241B4) },
	{ BCM4329_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4329) },
	{ BCM4330_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4330) },
	{ BCM4334_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4334) },
558
	{ BCM4335_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4335) },
559
	{ BCM43362_CHIP_ID, 0xFFFFFFFE, BRCMF_FIRMWARE_NVRAM(BCM43362) },
560
	{ BCM4339_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4339) }
561 562 563
};


564
static const struct firmware *brcmf_sdio_get_fw(struct brcmf_sdio *bus,
565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601
						  enum brcmf_firmware_type type)
{
	const struct firmware *fw;
	const char *name;
	int err, i;

	for (i = 0; i < ARRAY_SIZE(brcmf_fwname_data); i++) {
		if (brcmf_fwname_data[i].chipid == bus->ci->chip &&
		    brcmf_fwname_data[i].revmsk & BIT(bus->ci->chiprev)) {
			switch (type) {
			case BRCMF_FIRMWARE_BIN:
				name = brcmf_fwname_data[i].bin;
				break;
			case BRCMF_FIRMWARE_NVRAM:
				name = brcmf_fwname_data[i].nv;
				break;
			default:
				brcmf_err("invalid firmware type (%d)\n", type);
				return NULL;
			}
			goto found;
		}
	}
	brcmf_err("Unknown chipid %d [%d]\n",
		  bus->ci->chip, bus->ci->chiprev);
	return NULL;

found:
	err = request_firmware(&fw, name, &bus->sdiodev->func[2]->dev);
	if ((err) || (!fw)) {
		brcmf_err("fail to request firmware %s (%d)\n", name, err);
		return NULL;
	}

	return fw;
}

602 603 604 605 606 607 608 609 610 611 612
static void pkt_align(struct sk_buff *p, int len, int align)
{
	uint datalign;
	datalign = (unsigned long)(p->data);
	datalign = roundup(datalign, (align)) - datalign;
	if (datalign)
		skb_pull(p, datalign);
	__skb_trim(p, len);
}

/* To check if there's window offered */
613
static bool data_ok(struct brcmf_sdio *bus)
614 615 616 617 618 619 620 621 622
{
	return (u8)(bus->tx_max - bus->tx_seq) != 0 &&
	       ((u8)(bus->tx_max - bus->tx_seq) & 0x80) == 0;
}

/*
 * Reads a register in the SDIO hardware block. This block occupies a series of
 * adresses on the 32 bit backplane bus.
 */
623 624
static int
r_sdreg32(struct brcmf_sdio *bus, u32 *regvar, u32 offset)
625
{
626
	u8 idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV);
627
	int ret;
628

629 630
	*regvar = brcmf_sdiod_regrl(bus->sdiodev,
				    bus->ci->c_inf[idx].base + offset, &ret);
631 632

	return ret;
633 634
}

635 636
static int
w_sdreg32(struct brcmf_sdio *bus, u32 regval, u32 reg_offset)
637
{
638
	u8 idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV);
639
	int ret;
640

641 642 643
	brcmf_sdiod_regwl(bus->sdiodev,
			  bus->ci->c_inf[idx].base + reg_offset,
			  regval, &ret);
644 645

	return ret;
646 647
}

648
static int
649
brcmf_sdio_kso_control(struct brcmf_sdio *bus, bool on)
650 651 652 653 654 655 656 657 658
{
	u8 wr_val = 0, rd_val, cmp_val, bmask;
	int err = 0;
	int try_cnt = 0;

	brcmf_dbg(TRACE, "Enter\n");

	wr_val = (on << SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT);
	/* 1st KSO write goes to AOS wake up core if device is asleep  */
659 660
	brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
			  wr_val, &err);
661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689
	if (err) {
		brcmf_err("SDIO_AOS KSO write error: %d\n", err);
		return err;
	}

	if (on) {
		/* device WAKEUP through KSO:
		 * write bit 0 & read back until
		 * both bits 0 (kso bit) & 1 (dev on status) are set
		 */
		cmp_val = SBSDIO_FUNC1_SLEEPCSR_KSO_MASK |
			  SBSDIO_FUNC1_SLEEPCSR_DEVON_MASK;
		bmask = cmp_val;
		usleep_range(2000, 3000);
	} else {
		/* Put device to sleep, turn off KSO */
		cmp_val = 0;
		/* only check for bit0, bit1(dev on status) may not
		 * get cleared right away
		 */
		bmask = SBSDIO_FUNC1_SLEEPCSR_KSO_MASK;
	}

	do {
		/* reliable KSO bit set/clr:
		 * the sdiod sleep write access is synced to PMU 32khz clk
		 * just one write attempt may fail,
		 * read it back until it matches written value
		 */
690 691
		rd_val = brcmf_sdiod_regrb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
					   &err);
692 693 694 695 696
		if (((rd_val & bmask) == cmp_val) && !err)
			break;
		brcmf_dbg(SDIO, "KSO wr/rd retry:%d (max: %d) ERR:%x\n",
			  try_cnt, MAX_KSO_ATTEMPTS, err);
		udelay(KSO_WAIT_US);
697 698
		brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
				  wr_val, &err);
699 700 701 702 703
	} while (try_cnt++ < MAX_KSO_ATTEMPTS);

	return err;
}

704 705 706 707 708
#define PKT_AVAILABLE()		(intstatus & I_HMB_FRAME_IND)

#define HOSTINTMASK		(I_HMB_SW_MASK | I_CHIPACTIVE)

/* Turn backplane clock on or off */
709
static int brcmf_sdio_htclk(struct brcmf_sdio *bus, bool on, bool pendok)
710 711 712 713 714
{
	int err;
	u8 clkctl, clkreq, devctl;
	unsigned long timeout;

715
	brcmf_dbg(SDIO, "Enter\n");
716 717 718

	clkctl = 0;

719 720 721 722 723
	if (bus->sr_enabled) {
		bus->clkstate = (on ? CLK_AVAIL : CLK_SDONLY);
		return 0;
	}

724 725 726 727 728
	if (on) {
		/* Request HT Avail */
		clkreq =
		    bus->alp_only ? SBSDIO_ALP_AVAIL_REQ : SBSDIO_HT_AVAIL_REQ;

729 730
		brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
				  clkreq, &err);
731
		if (err) {
732
			brcmf_err("HT Avail request error: %d\n", err);
733 734 735 736
			return -EBADE;
		}

		/* Check current status */
737 738
		clkctl = brcmf_sdiod_regrb(bus->sdiodev,
					   SBSDIO_FUNC1_CHIPCLKCSR, &err);
739
		if (err) {
740
			brcmf_err("HT Avail read error: %d\n", err);
741 742 743 744 745 746
			return -EBADE;
		}

		/* Go to pending and await interrupt if appropriate */
		if (!SBSDIO_CLKAV(clkctl, bus->alp_only) && pendok) {
			/* Allow only clock-available interrupt */
747 748
			devctl = brcmf_sdiod_regrb(bus->sdiodev,
						   SBSDIO_DEVICE_CTL, &err);
749
			if (err) {
750
				brcmf_err("Devctl error setting CA: %d\n",
751 752 753 754 755
					  err);
				return -EBADE;
			}

			devctl |= SBSDIO_DEVCTL_CA_INT_ONLY;
756 757
			brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL,
					  devctl, &err);
758
			brcmf_dbg(SDIO, "CLKCTL: set PENDING\n");
759 760 761 762 763
			bus->clkstate = CLK_PENDING;

			return 0;
		} else if (bus->clkstate == CLK_PENDING) {
			/* Cancel CA-only interrupt filter */
764 765
			devctl = brcmf_sdiod_regrb(bus->sdiodev,
						   SBSDIO_DEVICE_CTL, &err);
766
			devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY;
767 768
			brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL,
					  devctl, &err);
769 770 771 772 773 774
		}

		/* Otherwise, wait here (polling) for HT Avail */
		timeout = jiffies +
			  msecs_to_jiffies(PMU_MAX_TRANSITION_DLY/1000);
		while (!SBSDIO_CLKAV(clkctl, bus->alp_only)) {
775 776 777
			clkctl = brcmf_sdiod_regrb(bus->sdiodev,
						   SBSDIO_FUNC1_CHIPCLKCSR,
						   &err);
778 779 780 781 782 783
			if (time_after(jiffies, timeout))
				break;
			else
				usleep_range(5000, 10000);
		}
		if (err) {
784
			brcmf_err("HT Avail request error: %d\n", err);
785 786 787
			return -EBADE;
		}
		if (!SBSDIO_CLKAV(clkctl, bus->alp_only)) {
788
			brcmf_err("HT Avail timeout (%d): clkctl 0x%02x\n",
789 790 791 792 793 794
				  PMU_MAX_TRANSITION_DLY, clkctl);
			return -EBADE;
		}

		/* Mark clock available */
		bus->clkstate = CLK_AVAIL;
795
		brcmf_dbg(SDIO, "CLKCTL: turned ON\n");
796

J
Joe Perches 已提交
797
#if defined(DEBUG)
798
		if (!bus->alp_only) {
799
			if (SBSDIO_ALPONLY(clkctl))
800
				brcmf_err("HT Clock should be on\n");
801
		}
J
Joe Perches 已提交
802
#endif				/* defined (DEBUG) */
803 804 805 806 807 808 809

		bus->activity = true;
	} else {
		clkreq = 0;

		if (bus->clkstate == CLK_PENDING) {
			/* Cancel CA-only interrupt filter */
810 811
			devctl = brcmf_sdiod_regrb(bus->sdiodev,
						   SBSDIO_DEVICE_CTL, &err);
812
			devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY;
813 814
			brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL,
					  devctl, &err);
815 816 817
		}

		bus->clkstate = CLK_SDONLY;
818 819
		brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
				  clkreq, &err);
820
		brcmf_dbg(SDIO, "CLKCTL: turned OFF\n");
821
		if (err) {
822
			brcmf_err("Failed access turning clock off: %d\n",
823 824 825 826 827 828 829 830
				  err);
			return -EBADE;
		}
	}
	return 0;
}

/* Change idle/active SD state */
831
static int brcmf_sdio_sdclk(struct brcmf_sdio *bus, bool on)
832
{
833
	brcmf_dbg(SDIO, "Enter\n");
834 835 836 837 838 839 840 841 842 843

	if (on)
		bus->clkstate = CLK_SDONLY;
	else
		bus->clkstate = CLK_NONE;

	return 0;
}

/* Transition SD and backplane clock readiness */
844
static int brcmf_sdio_clkctl(struct brcmf_sdio *bus, uint target, bool pendok)
845
{
J
Joe Perches 已提交
846
#ifdef DEBUG
847
	uint oldstate = bus->clkstate;
J
Joe Perches 已提交
848
#endif				/* DEBUG */
849

850
	brcmf_dbg(SDIO, "Enter\n");
851 852 853 854

	/* Early exit if we're already there */
	if (bus->clkstate == target) {
		if (target == CLK_AVAIL) {
855
			brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
856 857 858 859 860 861 862 863 864
			bus->activity = true;
		}
		return 0;
	}

	switch (target) {
	case CLK_AVAIL:
		/* Make sure SD clock is available */
		if (bus->clkstate == CLK_NONE)
865
			brcmf_sdio_sdclk(bus, true);
866
		/* Now request HT Avail on the backplane */
867 868
		brcmf_sdio_htclk(bus, true, pendok);
		brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
869 870 871 872 873 874
		bus->activity = true;
		break;

	case CLK_SDONLY:
		/* Remove HT request, or bring up SD clock */
		if (bus->clkstate == CLK_NONE)
875
			brcmf_sdio_sdclk(bus, true);
876
		else if (bus->clkstate == CLK_AVAIL)
877
			brcmf_sdio_htclk(bus, false, false);
878
		else
879
			brcmf_err("request for %d -> %d\n",
880
				  bus->clkstate, target);
881
		brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
882 883 884 885 886
		break;

	case CLK_NONE:
		/* Make sure to remove HT request */
		if (bus->clkstate == CLK_AVAIL)
887
			brcmf_sdio_htclk(bus, false, false);
888
		/* Now remove the SD clock */
889 890
		brcmf_sdio_sdclk(bus, false);
		brcmf_sdio_wd_timer(bus, 0);
891 892
		break;
	}
J
Joe Perches 已提交
893
#ifdef DEBUG
894
	brcmf_dbg(SDIO, "%d -> %d\n", oldstate, bus->clkstate);
J
Joe Perches 已提交
895
#endif				/* DEBUG */
896 897 898 899

	return 0;
}

900
static int
901
brcmf_sdio_bus_sleep(struct brcmf_sdio *bus, bool sleep, bool pendok)
902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923
{
	int err = 0;
	brcmf_dbg(TRACE, "Enter\n");
	brcmf_dbg(SDIO, "request %s currently %s\n",
		  (sleep ? "SLEEP" : "WAKE"),
		  (bus->sleeping ? "SLEEP" : "WAKE"));

	/* If SR is enabled control bus state with KSO */
	if (bus->sr_enabled) {
		/* Done if we're already in the requested state */
		if (sleep == bus->sleeping)
			goto end;

		/* Going to sleep */
		if (sleep) {
			/* Don't sleep if something is pending */
			if (atomic_read(&bus->intstatus) ||
			    atomic_read(&bus->ipend) > 0 ||
			    (!atomic_read(&bus->fcstate) &&
			    brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) &&
			    data_ok(bus)))
				 return -EBUSY;
924
			err = brcmf_sdio_kso_control(bus, false);
925 926
			/* disable watchdog */
			if (!err)
927
				brcmf_sdio_wd_timer(bus, 0);
928 929
		} else {
			bus->idlecount = 0;
930
			err = brcmf_sdio_kso_control(bus, true);
931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947
		}
		if (!err) {
			/* Change state */
			bus->sleeping = sleep;
			brcmf_dbg(SDIO, "new state %s\n",
				  (sleep ? "SLEEP" : "WAKE"));
		} else {
			brcmf_err("error while changing bus sleep state %d\n",
				  err);
			return err;
		}
	}

end:
	/* control clocks */
	if (sleep) {
		if (!bus->sr_enabled)
948
			brcmf_sdio_clkctl(bus, CLK_NONE, pendok);
949
	} else {
950
		brcmf_sdio_clkctl(bus, CLK_AVAIL, pendok);
951 952 953 954 955 956
	}

	return err;

}

957
static u32 brcmf_sdio_hostmail(struct brcmf_sdio *bus)
958 959 960 961
{
	u32 intstatus = 0;
	u32 hmb_data;
	u8 fcbits;
962
	int ret;
963

964
	brcmf_dbg(SDIO, "Enter\n");
965 966

	/* Read mailbox data and ack that we did so */
967 968
	ret = r_sdreg32(bus, &hmb_data,
			offsetof(struct sdpcmd_regs, tohostmailboxdata));
969

970
	if (ret == 0)
971
		w_sdreg32(bus, SMB_INT_ACK,
972
			  offsetof(struct sdpcmd_regs, tosbmailbox));
973
	bus->sdcnt.f1regdata += 2;
974 975 976

	/* Dongle recomposed rx frames, accept them again */
	if (hmb_data & HMB_DATA_NAKHANDLED) {
977
		brcmf_dbg(SDIO, "Dongle reports NAK handled, expect rtx of %d\n",
978 979
			  bus->rx_seq);
		if (!bus->rxskip)
980
			brcmf_err("unexpected NAKHANDLED!\n");
981 982 983 984 985 986 987 988 989 990 991 992 993

		bus->rxskip = false;
		intstatus |= I_HMB_FRAME_IND;
	}

	/*
	 * DEVREADY does not occur with gSPI.
	 */
	if (hmb_data & (HMB_DATA_DEVREADY | HMB_DATA_FWREADY)) {
		bus->sdpcm_ver =
		    (hmb_data & HMB_DATA_VERSION_MASK) >>
		    HMB_DATA_VERSION_SHIFT;
		if (bus->sdpcm_ver != SDPCM_PROT_VERSION)
994
			brcmf_err("Version mismatch, dongle reports %d, "
995 996 997
				  "expecting %d\n",
				  bus->sdpcm_ver, SDPCM_PROT_VERSION);
		else
998
			brcmf_dbg(SDIO, "Dongle ready, protocol version %d\n",
999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011
				  bus->sdpcm_ver);
	}

	/*
	 * Flow Control has been moved into the RX headers and this out of band
	 * method isn't used any more.
	 * remaining backward compatible with older dongles.
	 */
	if (hmb_data & HMB_DATA_FC) {
		fcbits = (hmb_data & HMB_DATA_FCDATA_MASK) >>
							HMB_DATA_FCDATA_SHIFT;

		if (fcbits & ~bus->flowcontrol)
1012
			bus->sdcnt.fc_xoff++;
1013 1014

		if (bus->flowcontrol & ~fcbits)
1015
			bus->sdcnt.fc_xon++;
1016

1017
		bus->sdcnt.fc_rcvd++;
1018 1019 1020 1021 1022 1023 1024 1025 1026
		bus->flowcontrol = fcbits;
	}

	/* Shouldn't be any others */
	if (hmb_data & ~(HMB_DATA_DEVREADY |
			 HMB_DATA_NAKHANDLED |
			 HMB_DATA_FC |
			 HMB_DATA_FWREADY |
			 HMB_DATA_FCDATA_MASK | HMB_DATA_VERSION_MASK))
1027
		brcmf_err("Unknown mailbox data content: 0x%02x\n",
1028 1029 1030 1031 1032
			  hmb_data);

	return intstatus;
}

1033
static void brcmf_sdio_rxfail(struct brcmf_sdio *bus, bool abort, bool rtx)
1034 1035 1036 1037 1038 1039
{
	uint retries = 0;
	u16 lastrbc;
	u8 hi, lo;
	int err;

1040
	brcmf_err("%sterminate frame%s\n",
1041 1042 1043 1044
		  abort ? "abort command, " : "",
		  rtx ? ", send NAK" : "");

	if (abort)
1045
		brcmf_sdiod_abort(bus->sdiodev, SDIO_FUNC_2);
1046

1047 1048
	brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL,
			  SFC_RF_TERM, &err);
1049
	bus->sdcnt.f1regdata++;
1050 1051 1052

	/* Wait until the packet has been flushed (device/FIFO stable) */
	for (lastrbc = retries = 0xffff; retries > 0; retries--) {
1053 1054 1055 1056
		hi = brcmf_sdiod_regrb(bus->sdiodev,
				       SBSDIO_FUNC1_RFRAMEBCHI, &err);
		lo = brcmf_sdiod_regrb(bus->sdiodev,
				       SBSDIO_FUNC1_RFRAMEBCLO, &err);
1057
		bus->sdcnt.f1regdata += 2;
1058 1059 1060 1061 1062

		if ((hi == 0) && (lo == 0))
			break;

		if ((hi > (lastrbc >> 8)) && (lo > (lastrbc & 0x00ff))) {
1063
			brcmf_err("count growing: last 0x%04x now 0x%04x\n",
1064 1065 1066 1067 1068 1069
				  lastrbc, (hi << 8) + lo);
		}
		lastrbc = (hi << 8) + lo;
	}

	if (!retries)
1070
		brcmf_err("count never zeroed: last 0x%04x\n", lastrbc);
1071
	else
1072
		brcmf_dbg(SDIO, "flush took %d iterations\n", 0xffff - retries);
1073 1074

	if (rtx) {
1075
		bus->sdcnt.rxrtx++;
1076 1077
		err = w_sdreg32(bus, SMB_NAK,
				offsetof(struct sdpcmd_regs, tosbmailbox));
1078

1079
		bus->sdcnt.f1regdata++;
1080
		if (err == 0)
1081 1082 1083 1084
			bus->rxskip = true;
	}

	/* Clear partial in any case */
1085
	bus->cur_read.len = 0;
1086 1087

	/* If we can't reach the device, signal failure */
1088
	if (err)
1089
		bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
1090 1091
}

1092
/* return total length of buffer chain */
1093
static uint brcmf_sdio_glom_len(struct brcmf_sdio *bus)
1094 1095 1096 1097 1098 1099 1100 1101 1102 1103
{
	struct sk_buff *p;
	uint total;

	total = 0;
	skb_queue_walk(&bus->glom, p)
		total += p->len;
	return total;
}

1104
static void brcmf_sdio_free_glom(struct brcmf_sdio *bus)
1105 1106 1107 1108 1109 1110 1111 1112 1113
{
	struct sk_buff *cur, *next;

	skb_queue_walk_safe(&bus->glom, cur, next) {
		skb_unlink(cur, &bus->glom);
		brcmu_pkt_buf_free_skb(cur);
	}
}

1114 1115 1116 1117 1118 1119
/**
 * brcmfmac sdio bus specific header
 * This is the lowest layer header wrapped on the packets transmitted between
 * host and WiFi dongle which contains information needed for SDIO core and
 * firmware
 *
1120 1121
 * It consists of 3 parts: hardware header, hardware extension header and
 * software header
1122 1123 1124
 * hardware header (frame tag) - 4 bytes
 * Byte 0~1: Frame length
 * Byte 2~3: Checksum, bit-wise inverse of frame length
1125 1126 1127 1128 1129 1130 1131
 * hardware extension header - 8 bytes
 * Tx glom mode only, N/A for Rx or normal Tx
 * Byte 0~1: Packet length excluding hw frame tag
 * Byte 2: Reserved
 * Byte 3: Frame flags, bit 0: last frame indication
 * Byte 4~5: Reserved
 * Byte 6~7: Tail padding length
1132 1133 1134 1135 1136 1137 1138 1139 1140 1141
 * software header - 8 bytes
 * Byte 0: Rx/Tx sequence number
 * Byte 1: 4 MSB Channel number, 4 LSB arbitrary flag
 * Byte 2: Length of next data frame, reserved for Tx
 * Byte 3: Data offset
 * Byte 4: Flow control bits, reserved for Tx
 * Byte 5: Maximum Sequence number allowed by firmware for Tx, N/A for Tx packet
 * Byte 6~7: Reserved
 */
#define SDPCM_HWHDR_LEN			4
1142
#define SDPCM_HWEXT_LEN			8
1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173
#define SDPCM_SWHDR_LEN			8
#define SDPCM_HDRLEN			(SDPCM_HWHDR_LEN + SDPCM_SWHDR_LEN)
/* software header */
#define SDPCM_SEQ_MASK			0x000000ff
#define SDPCM_SEQ_WRAP			256
#define SDPCM_CHANNEL_MASK		0x00000f00
#define SDPCM_CHANNEL_SHIFT		8
#define SDPCM_CONTROL_CHANNEL		0	/* Control */
#define SDPCM_EVENT_CHANNEL		1	/* Asyc Event Indication */
#define SDPCM_DATA_CHANNEL		2	/* Data Xmit/Recv */
#define SDPCM_GLOM_CHANNEL		3	/* Coalesced packets */
#define SDPCM_TEST_CHANNEL		15	/* Test/debug packets */
#define SDPCM_GLOMDESC(p)		(((u8 *)p)[1] & 0x80)
#define SDPCM_NEXTLEN_MASK		0x00ff0000
#define SDPCM_NEXTLEN_SHIFT		16
#define SDPCM_DOFFSET_MASK		0xff000000
#define SDPCM_DOFFSET_SHIFT		24
#define SDPCM_FCMASK_MASK		0x000000ff
#define SDPCM_WINDOW_MASK		0x0000ff00
#define SDPCM_WINDOW_SHIFT		8

static inline u8 brcmf_sdio_getdatoffset(u8 *swheader)
{
	u32 hdrvalue;
	hdrvalue = *(u32 *)swheader;
	return (u8)((hdrvalue & SDPCM_DOFFSET_MASK) >> SDPCM_DOFFSET_SHIFT);
}

static int brcmf_sdio_hdparse(struct brcmf_sdio *bus, u8 *header,
			      struct brcmf_sdio_hdrinfo *rd,
			      enum brcmf_sdio_frmtype type)
1174 1175 1176
{
	u16 len, checksum;
	u8 rx_seq, fc, tx_seq_max;
1177
	u32 swheader;
1178

1179
	trace_brcmf_sdpcm_hdr(SDPCM_RX, header);
1180

1181
	/* hw header */
1182 1183 1184 1185 1186
	len = get_unaligned_le16(header);
	checksum = get_unaligned_le16(header + sizeof(u16));
	/* All zero means no more to read */
	if (!(len | checksum)) {
		bus->rxpending = false;
1187
		return -ENODATA;
1188 1189
	}
	if ((u16)(~(len ^ checksum))) {
1190
		brcmf_err("HW header checksum error\n");
1191
		bus->sdcnt.rx_badhdr++;
1192
		brcmf_sdio_rxfail(bus, false, false);
1193
		return -EIO;
1194 1195
	}
	if (len < SDPCM_HDRLEN) {
1196
		brcmf_err("HW header length error\n");
1197
		return -EPROTO;
1198
	}
1199 1200
	if (type == BRCMF_SDIO_FT_SUPER &&
	    (roundup(len, bus->blocksize) != rd->len)) {
1201
		brcmf_err("HW superframe header length error\n");
1202
		return -EPROTO;
1203 1204
	}
	if (type == BRCMF_SDIO_FT_SUB && len > rd->len) {
1205
		brcmf_err("HW subframe header length error\n");
1206
		return -EPROTO;
1207
	}
1208 1209
	rd->len = len;

1210 1211 1212 1213
	/* software header */
	header += SDPCM_HWHDR_LEN;
	swheader = le32_to_cpu(*(__le32 *)header);
	if (type == BRCMF_SDIO_FT_SUPER && SDPCM_GLOMDESC(header)) {
1214
		brcmf_err("Glom descriptor found in superframe head\n");
1215
		rd->len = 0;
1216
		return -EINVAL;
1217
	}
1218 1219
	rx_seq = (u8)(swheader & SDPCM_SEQ_MASK);
	rd->channel = (swheader & SDPCM_CHANNEL_MASK) >> SDPCM_CHANNEL_SHIFT;
1220 1221
	if (len > MAX_RX_DATASZ && rd->channel != SDPCM_CONTROL_CHANNEL &&
	    type != BRCMF_SDIO_FT_SUPER) {
1222
		brcmf_err("HW header length too long\n");
1223
		bus->sdcnt.rx_toolong++;
1224
		brcmf_sdio_rxfail(bus, false, false);
1225
		rd->len = 0;
1226
		return -EPROTO;
1227
	}
1228
	if (type == BRCMF_SDIO_FT_SUPER && rd->channel != SDPCM_GLOM_CHANNEL) {
1229
		brcmf_err("Wrong channel for superframe\n");
1230
		rd->len = 0;
1231
		return -EINVAL;
1232 1233 1234
	}
	if (type == BRCMF_SDIO_FT_SUB && rd->channel != SDPCM_DATA_CHANNEL &&
	    rd->channel != SDPCM_EVENT_CHANNEL) {
1235
		brcmf_err("Wrong channel for subframe\n");
1236
		rd->len = 0;
1237
		return -EINVAL;
1238
	}
1239
	rd->dat_offset = brcmf_sdio_getdatoffset(header);
1240
	if (rd->dat_offset < SDPCM_HDRLEN || rd->dat_offset > rd->len) {
1241
		brcmf_err("seq %d: bad data offset\n", rx_seq);
1242
		bus->sdcnt.rx_badhdr++;
1243
		brcmf_sdio_rxfail(bus, false, false);
1244
		rd->len = 0;
1245
		return -ENXIO;
1246 1247
	}
	if (rd->seq_num != rx_seq) {
1248
		brcmf_err("seq %d: sequence number error, expect %d\n",
1249 1250 1251 1252
			  rx_seq, rd->seq_num);
		bus->sdcnt.rx_badseq++;
		rd->seq_num = rx_seq;
	}
1253 1254
	/* no need to check the reset for subframe */
	if (type == BRCMF_SDIO_FT_SUB)
1255
		return 0;
1256
	rd->len_nxtfrm = (swheader & SDPCM_NEXTLEN_MASK) >> SDPCM_NEXTLEN_SHIFT;
1257 1258 1259
	if (rd->len_nxtfrm << 4 > MAX_RX_DATASZ) {
		/* only warm for NON glom packet */
		if (rd->channel != SDPCM_GLOM_CHANNEL)
1260
			brcmf_err("seq %d: next length error\n", rx_seq);
1261 1262
		rd->len_nxtfrm = 0;
	}
1263 1264
	swheader = le32_to_cpu(*(__le32 *)(header + 4));
	fc = swheader & SDPCM_FCMASK_MASK;
1265 1266 1267 1268 1269 1270 1271 1272
	if (bus->flowcontrol != fc) {
		if (~bus->flowcontrol & fc)
			bus->sdcnt.fc_xoff++;
		if (bus->flowcontrol & ~fc)
			bus->sdcnt.fc_xon++;
		bus->sdcnt.fc_rcvd++;
		bus->flowcontrol = fc;
	}
1273
	tx_seq_max = (swheader & SDPCM_WINDOW_MASK) >> SDPCM_WINDOW_SHIFT;
1274
	if ((u8)(tx_seq_max - bus->tx_seq) > 0x40) {
1275
		brcmf_err("seq %d: max tx seq number error\n", rx_seq);
1276 1277 1278 1279
		tx_seq_max = bus->tx_seq + 2;
	}
	bus->tx_max = tx_seq_max;

1280
	return 0;
1281 1282
}

1283 1284 1285 1286 1287 1288 1289 1290 1291
static inline void brcmf_sdio_update_hwhdr(u8 *header, u16 frm_length)
{
	*(__le16 *)header = cpu_to_le16(frm_length);
	*(((__le16 *)header) + 1) = cpu_to_le16(~frm_length);
}

static void brcmf_sdio_hdpack(struct brcmf_sdio *bus, u8 *header,
			      struct brcmf_sdio_hdrinfo *hd_info)
{
1292 1293
	u32 hdrval;
	u8 hdr_offset;
1294 1295

	brcmf_sdio_update_hwhdr(header, hd_info->len);
1296 1297 1298 1299 1300 1301 1302 1303 1304
	hdr_offset = SDPCM_HWHDR_LEN;

	if (bus->txglom) {
		hdrval = (hd_info->len - hdr_offset) | (hd_info->lastfrm << 24);
		*((__le32 *)(header + hdr_offset)) = cpu_to_le32(hdrval);
		hdrval = (u16)hd_info->tail_pad << 16;
		*(((__le32 *)(header + hdr_offset)) + 1) = cpu_to_le32(hdrval);
		hdr_offset += SDPCM_HWEXT_LEN;
	}
1305

1306 1307 1308 1309 1310 1311 1312 1313
	hdrval = hd_info->seq_num;
	hdrval |= (hd_info->channel << SDPCM_CHANNEL_SHIFT) &
		  SDPCM_CHANNEL_MASK;
	hdrval |= (hd_info->dat_offset << SDPCM_DOFFSET_SHIFT) &
		  SDPCM_DOFFSET_MASK;
	*((__le32 *)(header + hdr_offset)) = cpu_to_le32(hdrval);
	*(((__le32 *)(header + hdr_offset)) + 1) = 0;
	trace_brcmf_sdpcm_hdr(SDPCM_TX + !!(bus->txglom), header);
1314 1315
}

1316
static u8 brcmf_sdio_rxglom(struct brcmf_sdio *bus, u8 rxseq)
1317 1318 1319
{
	u16 dlen, totlen;
	u8 *dptr, num = 0;
1320
	u16 sublen;
1321
	struct sk_buff *pfirst, *pnext;
1322 1323

	int errcode;
1324
	u8 doff, sfdoff;
1325

1326
	struct brcmf_sdio_hdrinfo rd_new;
1327 1328 1329 1330

	/* If packets, issue read(s) and send up packet chain */
	/* Return sequence numbers consumed? */

1331
	brcmf_dbg(SDIO, "start: glomd %p glom %p\n",
1332
		  bus->glomd, skb_peek(&bus->glom));
1333 1334 1335

	/* If there's a descriptor, generate the packet chain */
	if (bus->glomd) {
1336
		pfirst = pnext = NULL;
1337 1338 1339
		dlen = (u16) (bus->glomd->len);
		dptr = bus->glomd->data;
		if (!dlen || (dlen & 1)) {
1340
			brcmf_err("bad glomd len(%d), ignore descriptor\n",
1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351
				  dlen);
			dlen = 0;
		}

		for (totlen = num = 0; dlen; num++) {
			/* Get (and move past) next length */
			sublen = get_unaligned_le16(dptr);
			dlen -= sizeof(u16);
			dptr += sizeof(u16);
			if ((sublen < SDPCM_HDRLEN) ||
			    ((num == 0) && (sublen < (2 * SDPCM_HDRLEN)))) {
1352
				brcmf_err("descriptor len %d bad: %d\n",
1353 1354 1355 1356
					  num, sublen);
				pnext = NULL;
				break;
			}
1357
			if (sublen % bus->sgentry_align) {
1358
				brcmf_err("sublen %d not multiple of %d\n",
1359
					  sublen, bus->sgentry_align);
1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371
			}
			totlen += sublen;

			/* For last frame, adjust read len so total
				 is a block multiple */
			if (!dlen) {
				sublen +=
				    (roundup(totlen, bus->blocksize) - totlen);
				totlen = roundup(totlen, bus->blocksize);
			}

			/* Allocate/chain packet for next subframe */
1372
			pnext = brcmu_pkt_buf_get_skb(sublen + bus->sgentry_align);
1373
			if (pnext == NULL) {
1374
				brcmf_err("bcm_pkt_buf_get_skb failed, num %d len %d\n",
1375 1376 1377
					  num, sublen);
				break;
			}
1378
			skb_queue_tail(&bus->glom, pnext);
1379 1380

			/* Adhere to start alignment requirements */
1381
			pkt_align(pnext, sublen, bus->sgentry_align);
1382 1383 1384 1385 1386 1387 1388
		}

		/* If all allocations succeeded, save packet chain
			 in bus structure */
		if (pnext) {
			brcmf_dbg(GLOM, "allocated %d-byte packet chain for %d subframes\n",
				  totlen, num);
1389 1390
			if (BRCMF_GLOM_ON() && bus->cur_read.len &&
			    totlen != bus->cur_read.len) {
1391
				brcmf_dbg(GLOM, "glomdesc mismatch: nextlen %d glomdesc %d rxseq %d\n",
1392
					  bus->cur_read.len, totlen, rxseq);
1393 1394 1395
			}
			pfirst = pnext = NULL;
		} else {
1396
			brcmf_sdio_free_glom(bus);
1397 1398 1399 1400 1401 1402
			num = 0;
		}

		/* Done with descriptor packet */
		brcmu_pkt_buf_free_skb(bus->glomd);
		bus->glomd = NULL;
1403
		bus->cur_read.len = 0;
1404 1405 1406 1407
	}

	/* Ok -- either we just generated a packet chain,
		 or had one from before */
1408
	if (!skb_queue_empty(&bus->glom)) {
1409 1410
		if (BRCMF_GLOM_ON()) {
			brcmf_dbg(GLOM, "try superframe read, packet chain:\n");
1411
			skb_queue_walk(&bus->glom, pnext) {
1412 1413 1414 1415 1416 1417
				brcmf_dbg(GLOM, "    %p: %p len 0x%04x (%d)\n",
					  pnext, (u8 *) (pnext->data),
					  pnext->len, pnext->len);
			}
		}

1418
		pfirst = skb_peek(&bus->glom);
1419
		dlen = (u16) brcmf_sdio_glom_len(bus);
1420 1421 1422 1423 1424

		/* Do an SDIO read for the superframe.  Configurable iovar to
		 * read directly into the chained packet, or allocate a large
		 * packet and and copy into the chain.
		 */
1425
		sdio_claim_host(bus->sdiodev->func[1]);
1426 1427
		errcode = brcmf_sdiod_recv_chain(bus->sdiodev,
						 &bus->glom, dlen);
1428
		sdio_release_host(bus->sdiodev->func[1]);
1429
		bus->sdcnt.f2rxdata++;
1430 1431 1432

		/* On failure, kill the superframe, allow a couple retries */
		if (errcode < 0) {
1433
			brcmf_err("glom read of %d bytes failed: %d\n",
1434 1435
				  dlen, errcode);

1436
			sdio_claim_host(bus->sdiodev->func[1]);
1437
			if (bus->glomerr++ < 3) {
1438
				brcmf_sdio_rxfail(bus, true, true);
1439 1440
			} else {
				bus->glomerr = 0;
1441
				brcmf_sdio_rxfail(bus, true, false);
1442
				bus->sdcnt.rxglomfail++;
1443
				brcmf_sdio_free_glom(bus);
1444
			}
1445
			sdio_release_host(bus->sdiodev->func[1]);
1446 1447
			return 0;
		}
1448 1449 1450 1451

		brcmf_dbg_hex_dump(BRCMF_GLOM_ON(),
				   pfirst->data, min_t(int, pfirst->len, 48),
				   "SUPERFRAME:\n");
1452

1453 1454
		rd_new.seq_num = rxseq;
		rd_new.len = dlen;
1455
		sdio_claim_host(bus->sdiodev->func[1]);
1456 1457
		errcode = brcmf_sdio_hdparse(bus, pfirst->data, &rd_new,
					     BRCMF_SDIO_FT_SUPER);
1458
		sdio_release_host(bus->sdiodev->func[1]);
1459
		bus->cur_read.len = rd_new.len_nxtfrm << 4;
1460 1461

		/* Remove superframe header, remember offset */
1462 1463
		skb_pull(pfirst, rd_new.dat_offset);
		sfdoff = rd_new.dat_offset;
1464
		num = 0;
1465 1466

		/* Validate all the subframe headers */
1467 1468 1469 1470 1471
		skb_queue_walk(&bus->glom, pnext) {
			/* leave when invalid subframe is found */
			if (errcode)
				break;

1472 1473
			rd_new.len = pnext->len;
			rd_new.seq_num = rxseq++;
1474
			sdio_claim_host(bus->sdiodev->func[1]);
1475 1476
			errcode = brcmf_sdio_hdparse(bus, pnext->data, &rd_new,
						     BRCMF_SDIO_FT_SUB);
1477
			sdio_release_host(bus->sdiodev->func[1]);
1478
			brcmf_dbg_hex_dump(BRCMF_GLOM_ON(),
1479
					   pnext->data, 32, "subframe:\n");
1480

1481
			num++;
1482 1483 1484 1485 1486
		}

		if (errcode) {
			/* Terminate frame on error, request
				 a couple retries */
1487
			sdio_claim_host(bus->sdiodev->func[1]);
1488 1489 1490
			if (bus->glomerr++ < 3) {
				/* Restore superframe header space */
				skb_push(pfirst, sfdoff);
1491
				brcmf_sdio_rxfail(bus, true, true);
1492 1493
			} else {
				bus->glomerr = 0;
1494
				brcmf_sdio_rxfail(bus, true, false);
1495
				bus->sdcnt.rxglomfail++;
1496
				brcmf_sdio_free_glom(bus);
1497
			}
1498
			sdio_release_host(bus->sdiodev->func[1]);
1499
			bus->cur_read.len = 0;
1500 1501 1502 1503 1504
			return 0;
		}

		/* Basic SD framing looks ok - process each packet (header) */

1505
		skb_queue_walk_safe(&bus->glom, pfirst, pnext) {
1506 1507
			dptr = (u8 *) (pfirst->data);
			sublen = get_unaligned_le16(dptr);
1508
			doff = brcmf_sdio_getdatoffset(&dptr[SDPCM_HWHDR_LEN]);
1509

1510
			brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_DATA_ON(),
1511 1512
					   dptr, pfirst->len,
					   "Rx Subframe Data:\n");
1513 1514 1515 1516 1517

			__skb_trim(pfirst, sublen);
			skb_pull(pfirst, doff);

			if (pfirst->len == 0) {
1518
				skb_unlink(pfirst, &bus->glom);
1519 1520 1521 1522
				brcmu_pkt_buf_free_skb(pfirst);
				continue;
			}

1523 1524 1525 1526 1527 1528 1529
			brcmf_dbg_hex_dump(BRCMF_GLOM_ON(),
					   pfirst->data,
					   min_t(int, pfirst->len, 32),
					   "subframe %d to stack, %p (%p/%d) nxt/lnk %p/%p\n",
					   bus->glom.qlen, pfirst, pfirst->data,
					   pfirst->len, pfirst->next,
					   pfirst->prev);
1530 1531 1532
			skb_unlink(pfirst, &bus->glom);
			brcmf_rx_frame(bus->sdiodev->dev, pfirst);
			bus->sdcnt.rxglompkts++;
1533 1534
		}

1535
		bus->sdcnt.rxglomframes++;
1536 1537 1538 1539
	}
	return num;
}

1540 1541
static int brcmf_sdio_dcmd_resp_wait(struct brcmf_sdio *bus, uint *condition,
				     bool *pending)
1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561
{
	DECLARE_WAITQUEUE(wait, current);
	int timeout = msecs_to_jiffies(DCMD_RESP_TIMEOUT);

	/* Wait until control frame is available */
	add_wait_queue(&bus->dcmd_resp_wait, &wait);
	set_current_state(TASK_INTERRUPTIBLE);

	while (!(*condition) && (!signal_pending(current) && timeout))
		timeout = schedule_timeout(timeout);

	if (signal_pending(current))
		*pending = true;

	set_current_state(TASK_RUNNING);
	remove_wait_queue(&bus->dcmd_resp_wait, &wait);

	return timeout;
}

1562
static int brcmf_sdio_dcmd_resp_wake(struct brcmf_sdio *bus)
1563 1564 1565 1566 1567 1568 1569
{
	if (waitqueue_active(&bus->dcmd_resp_wait))
		wake_up_interruptible(&bus->dcmd_resp_wait);

	return 0;
}
static void
1570
brcmf_sdio_read_control(struct brcmf_sdio *bus, u8 *hdr, uint len, uint doff)
1571 1572
{
	uint rdlen, pad;
1573
	u8 *buf = NULL, *rbuf;
1574 1575 1576 1577
	int sdret;

	brcmf_dbg(TRACE, "Enter\n");

1578 1579
	if (bus->rxblen)
		buf = vzalloc(bus->rxblen);
1580
	if (!buf)
1581
		goto done;
1582

1583
	rbuf = bus->rxbuf;
1584
	pad = ((unsigned long)rbuf % bus->head_align);
1585
	if (pad)
1586
		rbuf += (bus->head_align - pad);
1587 1588

	/* Copy the already-read portion over */
1589
	memcpy(buf, hdr, BRCMF_FIRSTREAD);
1590 1591 1592 1593 1594 1595 1596 1597
	if (len <= BRCMF_FIRSTREAD)
		goto gotpkt;

	/* Raise rdlen to next SDIO block to avoid tail command */
	rdlen = len - BRCMF_FIRSTREAD;
	if (bus->roundup && bus->blocksize && (rdlen > bus->blocksize)) {
		pad = bus->blocksize - (rdlen % bus->blocksize);
		if ((pad <= bus->roundup) && (pad < bus->blocksize) &&
1598
		    ((len + pad) < bus->sdiodev->bus_if->maxctl))
1599
			rdlen += pad;
1600 1601
	} else if (rdlen % bus->head_align) {
		rdlen += bus->head_align - (rdlen % bus->head_align);
1602 1603 1604
	}

	/* Drop if the read is too big or it exceeds our maximum */
1605
	if ((rdlen + BRCMF_FIRSTREAD) > bus->sdiodev->bus_if->maxctl) {
1606
		brcmf_err("%d-byte control read exceeds %d-byte buffer\n",
1607
			  rdlen, bus->sdiodev->bus_if->maxctl);
1608
		brcmf_sdio_rxfail(bus, false, false);
1609 1610 1611
		goto done;
	}

1612
	if ((len - doff) > bus->sdiodev->bus_if->maxctl) {
1613
		brcmf_err("%d-byte ctl frame (%d-byte ctl data) exceeds %d-byte limit\n",
1614
			  len, len - doff, bus->sdiodev->bus_if->maxctl);
1615
		bus->sdcnt.rx_toolong++;
1616
		brcmf_sdio_rxfail(bus, false, false);
1617 1618 1619
		goto done;
	}

1620
	/* Read remain of frame body */
1621
	sdret = brcmf_sdiod_recv_buf(bus->sdiodev, rbuf, rdlen);
1622
	bus->sdcnt.f2rxdata++;
1623 1624 1625

	/* Control frame failures need retransmission */
	if (sdret < 0) {
1626
		brcmf_err("read %d control bytes failed: %d\n",
1627
			  rdlen, sdret);
1628
		bus->sdcnt.rxc_errors++;
1629
		brcmf_sdio_rxfail(bus, true, true);
1630
		goto done;
1631 1632
	} else
		memcpy(buf + BRCMF_FIRSTREAD, rbuf, rdlen);
1633 1634 1635

gotpkt:

1636
	brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_CTL_ON(),
1637
			   buf, len, "RxCtrl:\n");
1638 1639

	/* Point to valid data and indicate its length */
1640 1641
	spin_lock_bh(&bus->rxctl_lock);
	if (bus->rxctl) {
1642
		brcmf_err("last control frame is being processed.\n");
1643 1644 1645 1646 1647 1648
		spin_unlock_bh(&bus->rxctl_lock);
		vfree(buf);
		goto done;
	}
	bus->rxctl = buf + doff;
	bus->rxctl_orig = buf;
1649
	bus->rxlen = len - doff;
1650
	spin_unlock_bh(&bus->rxctl_lock);
1651 1652 1653

done:
	/* Awake any waiters */
1654
	brcmf_sdio_dcmd_resp_wake(bus);
1655 1656 1657
}

/* Pad read to blocksize for efficiency */
1658
static void brcmf_sdio_pad(struct brcmf_sdio *bus, u16 *pad, u16 *rdlen)
1659 1660 1661 1662 1663 1664
{
	if (bus->roundup && bus->blocksize && *rdlen > bus->blocksize) {
		*pad = bus->blocksize - (*rdlen % bus->blocksize);
		if (*pad <= bus->roundup && *pad < bus->blocksize &&
		    *rdlen + *pad + BRCMF_FIRSTREAD < MAX_RX_DATASZ)
			*rdlen += *pad;
1665 1666
	} else if (*rdlen % bus->head_align) {
		*rdlen += bus->head_align - (*rdlen % bus->head_align);
1667 1668 1669
	}
}

1670
static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
1671 1672 1673 1674
{
	struct sk_buff *pkt;		/* Packet for event or data frames */
	u16 pad;		/* Number of pad bytes to read */
	uint rxleft = 0;	/* Remaining number of frames allowed */
1675
	int ret;		/* Return code from calls */
1676
	uint rxcount = 0;	/* Total frames read */
1677
	struct brcmf_sdio_hdrinfo *rd = &bus->cur_read, rd_new;
1678
	u8 head_read = 0;
1679 1680 1681 1682

	brcmf_dbg(TRACE, "Enter\n");

	/* Not finished unless we encounter no more frames indication */
1683
	bus->rxpending = true;
1684

1685
	for (rd->seq_num = bus->rx_seq, rxleft = maxframes;
1686
	     !bus->rxskip && rxleft &&
1687
	     bus->sdiodev->bus_if->state != BRCMF_BUS_DOWN;
1688
	     rd->seq_num++, rxleft--) {
1689 1690

		/* Handle glomming separately */
1691
		if (bus->glomd || !skb_queue_empty(&bus->glom)) {
1692 1693
			u8 cnt;
			brcmf_dbg(GLOM, "calling rxglom: glomd %p, glom %p\n",
1694
				  bus->glomd, skb_peek(&bus->glom));
1695
			cnt = brcmf_sdio_rxglom(bus, rd->seq_num);
1696
			brcmf_dbg(GLOM, "rxglom returned %d\n", cnt);
1697
			rd->seq_num += cnt - 1;
1698 1699 1700 1701
			rxleft = (rxleft > cnt) ? (rxleft - cnt) : 1;
			continue;
		}

1702 1703
		rd->len_left = rd->len;
		/* read header first for unknow frame length */
1704
		sdio_claim_host(bus->sdiodev->func[1]);
1705
		if (!rd->len) {
1706 1707
			ret = brcmf_sdiod_recv_buf(bus->sdiodev,
						   bus->rxhdr, BRCMF_FIRSTREAD);
1708
			bus->sdcnt.f2rxhdrs++;
1709
			if (ret < 0) {
1710
				brcmf_err("RXHEADER FAILED: %d\n",
1711
					  ret);
1712
				bus->sdcnt.rx_hdrfail++;
1713
				brcmf_sdio_rxfail(bus, true, true);
1714
				sdio_release_host(bus->sdiodev->func[1]);
1715 1716 1717
				continue;
			}

1718
			brcmf_dbg_hex_dump(BRCMF_BYTES_ON() || BRCMF_HDRS_ON(),
1719 1720
					   bus->rxhdr, SDPCM_HDRLEN,
					   "RxHdr:\n");
1721

1722 1723
			if (brcmf_sdio_hdparse(bus, bus->rxhdr, rd,
					       BRCMF_SDIO_FT_NORMAL)) {
1724
				sdio_release_host(bus->sdiodev->func[1]);
1725 1726 1727 1728
				if (!bus->rxpending)
					break;
				else
					continue;
1729 1730
			}

1731
			if (rd->channel == SDPCM_CONTROL_CHANNEL) {
1732 1733 1734
				brcmf_sdio_read_control(bus, bus->rxhdr,
							rd->len,
							rd->dat_offset);
1735 1736 1737 1738 1739
				/* prepare the descriptor for the next read */
				rd->len = rd->len_nxtfrm << 4;
				rd->len_nxtfrm = 0;
				/* treat all packet as event if we don't know */
				rd->channel = SDPCM_EVENT_CHANNEL;
1740
				sdio_release_host(bus->sdiodev->func[1]);
1741 1742
				continue;
			}
1743 1744 1745
			rd->len_left = rd->len > BRCMF_FIRSTREAD ?
				       rd->len - BRCMF_FIRSTREAD : 0;
			head_read = BRCMF_FIRSTREAD;
1746 1747
		}

1748
		brcmf_sdio_pad(bus, &pad, &rd->len_left);
1749

1750
		pkt = brcmu_pkt_buf_get_skb(rd->len_left + head_read +
1751
					    bus->head_align);
1752 1753
		if (!pkt) {
			/* Give up on data, request rtx of events */
1754
			brcmf_err("brcmu_pkt_buf_get_skb failed\n");
1755
			brcmf_sdio_rxfail(bus, false,
1756
					    RETRYCHAN(rd->channel));
1757
			sdio_release_host(bus->sdiodev->func[1]);
1758 1759
			continue;
		}
1760
		skb_pull(pkt, head_read);
1761
		pkt_align(pkt, rd->len_left, bus->head_align);
1762

1763
		ret = brcmf_sdiod_recv_pkt(bus->sdiodev, pkt);
1764
		bus->sdcnt.f2rxdata++;
1765
		sdio_release_host(bus->sdiodev->func[1]);
1766

1767
		if (ret < 0) {
1768
			brcmf_err("read %d bytes from channel %d failed: %d\n",
1769
				  rd->len, rd->channel, ret);
1770
			brcmu_pkt_buf_free_skb(pkt);
1771
			sdio_claim_host(bus->sdiodev->func[1]);
1772
			brcmf_sdio_rxfail(bus, true,
1773
					    RETRYCHAN(rd->channel));
1774
			sdio_release_host(bus->sdiodev->func[1]);
1775 1776 1777
			continue;
		}

1778 1779 1780 1781 1782 1783 1784
		if (head_read) {
			skb_push(pkt, head_read);
			memcpy(pkt->data, bus->rxhdr, head_read);
			head_read = 0;
		} else {
			memcpy(bus->rxhdr, pkt->data, SDPCM_HDRLEN);
			rd_new.seq_num = rd->seq_num;
1785
			sdio_claim_host(bus->sdiodev->func[1]);
1786 1787
			if (brcmf_sdio_hdparse(bus, bus->rxhdr, &rd_new,
					       BRCMF_SDIO_FT_NORMAL)) {
1788 1789 1790 1791 1792
				rd->len = 0;
				brcmu_pkt_buf_free_skb(pkt);
			}
			bus->sdcnt.rx_readahead_cnt++;
			if (rd->len != roundup(rd_new.len, 16)) {
1793
				brcmf_err("frame length mismatch:read %d, should be %d\n",
1794 1795 1796
					  rd->len,
					  roundup(rd_new.len, 16) >> 4);
				rd->len = 0;
1797
				brcmf_sdio_rxfail(bus, true, true);
1798
				sdio_release_host(bus->sdiodev->func[1]);
1799 1800 1801
				brcmu_pkt_buf_free_skb(pkt);
				continue;
			}
1802
			sdio_release_host(bus->sdiodev->func[1]);
1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813
			rd->len_nxtfrm = rd_new.len_nxtfrm;
			rd->channel = rd_new.channel;
			rd->dat_offset = rd_new.dat_offset;

			brcmf_dbg_hex_dump(!(BRCMF_BYTES_ON() &&
					     BRCMF_DATA_ON()) &&
					   BRCMF_HDRS_ON(),
					   bus->rxhdr, SDPCM_HDRLEN,
					   "RxHdr:\n");

			if (rd_new.channel == SDPCM_CONTROL_CHANNEL) {
1814
				brcmf_err("readahead on control packet %d?\n",
1815 1816 1817
					  rd_new.seq_num);
				/* Force retry w/normal header read */
				rd->len = 0;
1818
				sdio_claim_host(bus->sdiodev->func[1]);
1819
				brcmf_sdio_rxfail(bus, false, true);
1820
				sdio_release_host(bus->sdiodev->func[1]);
1821 1822 1823 1824
				brcmu_pkt_buf_free_skb(pkt);
				continue;
			}
		}
1825

1826
		brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_DATA_ON(),
1827
				   pkt->data, rd->len, "Rx Data:\n");
1828 1829

		/* Save superframe descriptor and allocate packet frame */
1830
		if (rd->channel == SDPCM_GLOM_CHANNEL) {
1831
			if (SDPCM_GLOMDESC(&bus->rxhdr[SDPCM_HWHDR_LEN])) {
1832
				brcmf_dbg(GLOM, "glom descriptor, %d bytes:\n",
1833
					  rd->len);
1834
				brcmf_dbg_hex_dump(BRCMF_GLOM_ON(),
1835
						   pkt->data, rd->len,
1836
						   "Glom Data:\n");
1837
				__skb_trim(pkt, rd->len);
1838 1839 1840
				skb_pull(pkt, SDPCM_HDRLEN);
				bus->glomd = pkt;
			} else {
1841
				brcmf_err("%s: glom superframe w/o "
1842
					  "descriptor!\n", __func__);
1843
				sdio_claim_host(bus->sdiodev->func[1]);
1844
				brcmf_sdio_rxfail(bus, false, false);
1845
				sdio_release_host(bus->sdiodev->func[1]);
1846
			}
1847 1848 1849 1850 1851
			/* prepare the descriptor for the next read */
			rd->len = rd->len_nxtfrm << 4;
			rd->len_nxtfrm = 0;
			/* treat all packet as event if we don't know */
			rd->channel = SDPCM_EVENT_CHANNEL;
1852 1853 1854 1855
			continue;
		}

		/* Fill in packet len and prio, deliver upward */
1856 1857 1858 1859 1860 1861 1862 1863
		__skb_trim(pkt, rd->len);
		skb_pull(pkt, rd->dat_offset);

		/* prepare the descriptor for the next read */
		rd->len = rd->len_nxtfrm << 4;
		rd->len_nxtfrm = 0;
		/* treat all packet as event if we don't know */
		rd->channel = SDPCM_EVENT_CHANNEL;
1864 1865 1866 1867 1868 1869

		if (pkt->len == 0) {
			brcmu_pkt_buf_free_skb(pkt);
			continue;
		}

1870
		brcmf_rx_frame(bus->sdiodev->dev, pkt);
1871
	}
1872

1873 1874 1875
	rxcount = maxframes - rxleft;
	/* Message if we hit the limit */
	if (!rxleft)
1876
		brcmf_dbg(DATA, "hit rx limit of %d frames\n", maxframes);
1877 1878 1879 1880
	else
		brcmf_dbg(DATA, "processed %d frames\n", rxcount);
	/* Back off rxseq if awaiting rtx, update rx_seq */
	if (bus->rxskip)
1881 1882
		rd->seq_num--;
	bus->rx_seq = rd->seq_num;
1883 1884 1885 1886 1887

	return rxcount;
}

static void
1888
brcmf_sdio_wait_event_wakeup(struct brcmf_sdio *bus)
1889 1890 1891 1892 1893 1894
{
	if (waitqueue_active(&bus->ctrl_wait))
		wake_up_interruptible(&bus->ctrl_wait);
	return;
}

1895 1896
static int brcmf_sdio_txpkt_hdalign(struct brcmf_sdio *bus, struct sk_buff *pkt)
{
1897
	u16 head_pad;
1898 1899 1900 1901 1902
	u8 *dat_buf;

	dat_buf = (u8 *)(pkt->data);

	/* Check head padding */
1903
	head_pad = ((unsigned long)dat_buf % bus->head_align);
1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917
	if (head_pad) {
		if (skb_headroom(pkt) < head_pad) {
			bus->sdiodev->bus_if->tx_realloc++;
			head_pad = 0;
			if (skb_cow(pkt, head_pad))
				return -ENOMEM;
		}
		skb_push(pkt, head_pad);
		dat_buf = (u8 *)(pkt->data);
		memset(dat_buf, 0, head_pad + bus->tx_hdrlen);
	}
	return head_pad;
}

1918 1919 1920 1921
/**
 * struct brcmf_skbuff_cb reserves first two bytes in sk_buff::cb for
 * bus layer usage.
 */
1922
/* flag marking a dummy skb added for DMA alignment requirement */
1923
#define ALIGN_SKB_FLAG		0x8000
1924
/* bit mask of data length chopped from the previous packet */
1925 1926
#define ALIGN_SKB_CHOP_LEN_MASK	0x7fff

1927
static int brcmf_sdio_txpkt_prep_sg(struct brcmf_sdio *bus,
1928
				    struct sk_buff_head *pktq,
1929
				    struct sk_buff *pkt, u16 total_len)
1930
{
1931
	struct brcmf_sdio_dev *sdiodev;
1932
	struct sk_buff *pkt_pad;
1933
	u16 tail_pad, tail_chop, chain_pad;
1934
	unsigned int blksize;
1935 1936
	bool lastfrm;
	int ntail, ret;
1937

1938
	sdiodev = bus->sdiodev;
1939 1940
	blksize = sdiodev->func[SDIO_FUNC_2]->cur_blksize;
	/* sg entry alignment should be a divisor of block size */
1941
	WARN_ON(blksize % bus->sgentry_align);
1942 1943

	/* Check tail padding */
1944 1945
	lastfrm = skb_queue_is_last(pktq, pkt);
	tail_pad = 0;
1946
	tail_chop = pkt->len % bus->sgentry_align;
1947
	if (tail_chop)
1948
		tail_pad = bus->sgentry_align - tail_chop;
1949 1950 1951
	chain_pad = (total_len + tail_pad) % blksize;
	if (lastfrm && chain_pad)
		tail_pad += blksize - chain_pad;
1952
	if (skb_tailroom(pkt) < tail_pad && pkt->len > blksize) {
1953 1954 1955
		pkt_pad = bus->txglom_sgpad;
		if (pkt_pad == NULL)
			  brcmu_pkt_buf_get_skb(tail_pad + tail_chop);
1956 1957
		if (pkt_pad == NULL)
			return -ENOMEM;
1958 1959 1960
		ret = brcmf_sdio_txpkt_hdalign(bus, pkt_pad);
		if (unlikely(ret < 0))
			return ret;
1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977
		memcpy(pkt_pad->data,
		       pkt->data + pkt->len - tail_chop,
		       tail_chop);
		*(u32 *)(pkt_pad->cb) = ALIGN_SKB_FLAG + tail_chop;
		skb_trim(pkt, pkt->len - tail_chop);
		__skb_queue_after(pktq, pkt, pkt_pad);
	} else {
		ntail = pkt->data_len + tail_pad -
			(pkt->end - pkt->tail);
		if (skb_cloned(pkt) || ntail > 0)
			if (pskb_expand_head(pkt, 0, ntail, GFP_ATOMIC))
				return -ENOMEM;
		if (skb_linearize(pkt))
			return -ENOMEM;
		__skb_put(pkt, tail_pad);
	}

1978
	return tail_pad;
1979 1980
}

1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995
/**
 * brcmf_sdio_txpkt_prep - packet preparation for transmit
 * @bus: brcmf_sdio structure pointer
 * @pktq: packet list pointer
 * @chan: virtual channel to transmit the packet
 *
 * Processes to be applied to the packet
 *	- Align data buffer pointer
 *	- Align data buffer length
 *	- Prepare header
 * Return: negative value if there is error
 */
static int
brcmf_sdio_txpkt_prep(struct brcmf_sdio *bus, struct sk_buff_head *pktq,
		      uint chan)
1996
{
1997
	u16 head_pad, total_len;
1998
	struct sk_buff *pkt_next;
1999 2000
	u8 txseq;
	int ret;
2001
	struct brcmf_sdio_hdrinfo hd_info = {0};
2002

2003 2004 2005 2006 2007 2008 2009 2010 2011 2012
	txseq = bus->tx_seq;
	total_len = 0;
	skb_queue_walk(pktq, pkt_next) {
		/* alignment packet inserted in previous
		 * loop cycle can be skipped as it is
		 * already properly aligned and does not
		 * need an sdpcm header.
		 */
		if (*(u32 *)(pkt_next->cb) & ALIGN_SKB_FLAG)
			continue;
2013

2014 2015 2016 2017 2018 2019 2020
		/* align packet data pointer */
		ret = brcmf_sdio_txpkt_hdalign(bus, pkt_next);
		if (ret < 0)
			return ret;
		head_pad = (u16)ret;
		if (head_pad)
			memset(pkt_next->data, 0, head_pad + bus->tx_hdrlen);
2021

2022
		total_len += pkt_next->len;
2023

2024
		hd_info.len = pkt_next->len;
2025 2026 2027 2028 2029 2030 2031 2032 2033
		hd_info.lastfrm = skb_queue_is_last(pktq, pkt_next);
		if (bus->txglom && pktq->qlen > 1) {
			ret = brcmf_sdio_txpkt_prep_sg(bus, pktq,
						       pkt_next, total_len);
			if (ret < 0)
				return ret;
			hd_info.tail_pad = (u16)ret;
			total_len += (u16)ret;
		}
2034

2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056
		hd_info.channel = chan;
		hd_info.dat_offset = head_pad + bus->tx_hdrlen;
		hd_info.seq_num = txseq++;

		/* Now fill the header */
		brcmf_sdio_hdpack(bus, pkt_next->data, &hd_info);

		if (BRCMF_BYTES_ON() &&
		    ((BRCMF_CTL_ON() && chan == SDPCM_CONTROL_CHANNEL) ||
		     (BRCMF_DATA_ON() && chan != SDPCM_CONTROL_CHANNEL)))
			brcmf_dbg_hex_dump(true, pkt_next, hd_info.len,
					   "Tx Frame:\n");
		else if (BRCMF_HDRS_ON())
			brcmf_dbg_hex_dump(true, pkt_next,
					   head_pad + bus->tx_hdrlen,
					   "Tx Header:\n");
	}
	/* Hardware length tag of the first packet should be total
	 * length of the chain (including padding)
	 */
	if (bus->txglom)
		brcmf_sdio_update_hwhdr(pktq->next->data, total_len);
2057 2058
	return 0;
}
2059

2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073
/**
 * brcmf_sdio_txpkt_postp - packet post processing for transmit
 * @bus: brcmf_sdio structure pointer
 * @pktq: packet list pointer
 *
 * Processes to be applied to the packet
 *	- Remove head padding
 *	- Remove tail padding
 */
static void
brcmf_sdio_txpkt_postp(struct brcmf_sdio *bus, struct sk_buff_head *pktq)
{
	u8 *hdr;
	u32 dat_offset;
2074
	u16 tail_pad;
2075 2076 2077 2078 2079
	u32 dummy_flags, chop_len;
	struct sk_buff *pkt_next, *tmp, *pkt_prev;

	skb_queue_walk_safe(pktq, pkt_next, tmp) {
		dummy_flags = *(u32 *)(pkt_next->cb);
2080 2081
		if (dummy_flags & ALIGN_SKB_FLAG) {
			chop_len = dummy_flags & ALIGN_SKB_CHOP_LEN_MASK;
2082 2083 2084 2085 2086 2087 2088
			if (chop_len) {
				pkt_prev = pkt_next->prev;
				skb_put(pkt_prev, chop_len);
			}
			__skb_unlink(pkt_next, pktq);
			brcmu_pkt_buf_free_skb(pkt_next);
		} else {
2089
			hdr = pkt_next->data + bus->tx_hdrlen - SDPCM_SWHDR_LEN;
2090 2091 2092 2093
			dat_offset = le32_to_cpu(*(__le32 *)hdr);
			dat_offset = (dat_offset & SDPCM_DOFFSET_MASK) >>
				     SDPCM_DOFFSET_SHIFT;
			skb_pull(pkt_next, dat_offset);
2094 2095 2096 2097
			if (bus->txglom) {
				tail_pad = le16_to_cpu(*(__le16 *)(hdr - 2));
				skb_trim(pkt_next, pkt_next->len - tail_pad);
			}
2098
		}
2099
	}
2100
}
2101

2102 2103
/* Writes a HW/SW header into the packet and sends it. */
/* Assumes: (a) header space already there, (b) caller holds lock */
2104 2105
static int brcmf_sdio_txpkt(struct brcmf_sdio *bus, struct sk_buff_head *pktq,
			    uint chan)
2106 2107 2108
{
	int ret;
	int i;
2109
	struct sk_buff *pkt_next, *tmp;
2110 2111 2112

	brcmf_dbg(TRACE, "Enter\n");

2113
	ret = brcmf_sdio_txpkt_prep(bus, pktq, chan);
2114 2115
	if (ret)
		goto done;
2116

2117
	sdio_claim_host(bus->sdiodev->func[1]);
2118
	ret = brcmf_sdiod_send_pkt(bus->sdiodev, pktq);
2119
	bus->sdcnt.f2txdata++;
2120 2121 2122 2123 2124

	if (ret < 0) {
		/* On failure, abort the command and terminate the frame */
		brcmf_dbg(INFO, "sdio error %d, abort command and terminate frame\n",
			  ret);
2125
		bus->sdcnt.tx_sderrs++;
2126

2127 2128 2129
		brcmf_sdiod_abort(bus->sdiodev, SDIO_FUNC_2);
		brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL,
				  SFC_WF_TERM, NULL);
2130
		bus->sdcnt.f1regdata++;
2131 2132 2133

		for (i = 0; i < 3; i++) {
			u8 hi, lo;
2134 2135 2136 2137
			hi = brcmf_sdiod_regrb(bus->sdiodev,
					       SBSDIO_FUNC1_WFRAMEBCHI, NULL);
			lo = brcmf_sdiod_regrb(bus->sdiodev,
					       SBSDIO_FUNC1_WFRAMEBCLO, NULL);
2138
			bus->sdcnt.f1regdata += 2;
2139 2140 2141 2142
			if ((hi == 0) && (lo == 0))
				break;
		}
	}
2143
	sdio_release_host(bus->sdiodev->func[1]);
2144 2145

done:
2146 2147 2148 2149 2150 2151 2152
	brcmf_sdio_txpkt_postp(bus, pktq);
	if (ret == 0)
		bus->tx_seq = (bus->tx_seq + pktq->qlen) % SDPCM_SEQ_WRAP;
	skb_queue_walk_safe(pktq, pkt_next, tmp) {
		__skb_unlink(pkt_next, pktq);
		brcmf_txcomplete(bus->sdiodev->dev, pkt_next, ret == 0);
	}
2153 2154 2155
	return ret;
}

2156
static uint brcmf_sdio_sendfromq(struct brcmf_sdio *bus, uint maxframes)
2157 2158
{
	struct sk_buff *pkt;
2159
	struct sk_buff_head pktq;
2160
	u32 intstatus = 0;
2161
	int ret = 0, prec_out, i;
2162
	uint cnt = 0;
2163
	u8 tx_prec_map, pkt_num;
2164 2165 2166 2167 2168 2169

	brcmf_dbg(TRACE, "Enter\n");

	tx_prec_map = ~bus->flowcontrol;

	/* Send frames until the limit or some other event */
2170 2171 2172 2173 2174 2175 2176 2177
	for (cnt = 0; (cnt < maxframes) && data_ok(bus);) {
		pkt_num = 1;
		__skb_queue_head_init(&pktq);
		if (bus->txglom)
			pkt_num = min_t(u8, bus->tx_max - bus->tx_seq,
					brcmf_sdio_txglomsz);
		pkt_num = min_t(u32, pkt_num,
				brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol));
2178
		spin_lock_bh(&bus->txqlock);
2179 2180 2181 2182 2183 2184
		for (i = 0; i < pkt_num; i++) {
			pkt = brcmu_pktq_mdeq(&bus->txq, tx_prec_map,
					      &prec_out);
			if (pkt == NULL)
				break;
			__skb_queue_tail(&pktq, pkt);
2185 2186
		}
		spin_unlock_bh(&bus->txqlock);
2187 2188
		if (i == 0)
			break;
2189

2190
		ret = brcmf_sdio_txpkt(bus, &pktq, SDPCM_DATA_CHANNEL);
2191
		cnt += i;
2192 2193 2194 2195

		/* In poll mode, need to check for other events */
		if (!bus->intr && cnt) {
			/* Check device status, signal pending interrupt */
2196
			sdio_claim_host(bus->sdiodev->func[1]);
2197 2198 2199
			ret = r_sdreg32(bus, &intstatus,
					offsetof(struct sdpcmd_regs,
						 intstatus));
2200
			sdio_release_host(bus->sdiodev->func[1]);
2201
			bus->sdcnt.f2txdata++;
2202
			if (ret != 0)
2203 2204
				break;
			if (intstatus & bus->hostintmask)
2205
				atomic_set(&bus->ipend, 1);
2206 2207 2208 2209
		}
	}

	/* Deflow-control stack if needed */
2210
	if ((bus->sdiodev->bus_if->state == BRCMF_BUS_DATA) &&
2211
	    bus->txoff && (pktq_len(&bus->txq) < TXLOW)) {
2212 2213
		bus->txoff = false;
		brcmf_txflowblock(bus->sdiodev->dev, false);
2214
	}
2215 2216 2217 2218

	return cnt;
}

2219
static void brcmf_sdio_bus_stop(struct device *dev)
2220 2221 2222 2223 2224
{
	u32 local_hostintmask;
	u8 saveclk;
	int err;
	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
2225
	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
2226 2227 2228 2229 2230 2231 2232 2233 2234 2235
	struct brcmf_sdio *bus = sdiodev->bus;

	brcmf_dbg(TRACE, "Enter\n");

	if (bus->watchdog_tsk) {
		send_sig(SIGTERM, bus->watchdog_tsk, 1);
		kthread_stop(bus->watchdog_tsk);
		bus->watchdog_tsk = NULL;
	}

2236
	sdio_claim_host(bus->sdiodev->func[1]);
2237 2238

	/* Enable clock for device interrupts */
2239
	brcmf_sdio_bus_sleep(bus, false, false);
2240 2241

	/* Disable and clear interrupts at the chip level also */
2242
	w_sdreg32(bus, 0, offsetof(struct sdpcmd_regs, hostintmask));
2243 2244 2245 2246 2247 2248 2249
	local_hostintmask = bus->hostintmask;
	bus->hostintmask = 0;

	/* Change our idea of bus state */
	bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;

	/* Force clocks on backplane to be sure F2 interrupt propagates */
2250 2251
	saveclk = brcmf_sdiod_regrb(bus->sdiodev,
				    SBSDIO_FUNC1_CHIPCLKCSR, &err);
2252
	if (!err) {
2253 2254
		brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
				  (saveclk | SBSDIO_FORCE_HT), &err);
2255 2256
	}
	if (err)
2257
		brcmf_err("Failed to force clock for F2: err %d\n", err);
2258 2259 2260

	/* Turn off the bus (F2), free any pending packets */
	brcmf_dbg(INTR, "disable SDIO interrupts\n");
2261
	sdio_disable_func(bus->sdiodev->func[SDIO_FUNC_2]);
2262 2263 2264

	/* Clear any pending interrupts now that F2 is disabled */
	w_sdreg32(bus, local_hostintmask,
2265
		  offsetof(struct sdpcmd_regs, intstatus));
2266 2267

	/* Turn off the backplane clock (only) */
2268
	brcmf_sdio_clkctl(bus, CLK_SDONLY, false);
2269
	sdio_release_host(bus->sdiodev->func[1]);
2270 2271 2272 2273 2274 2275 2276

	/* Clear the data packet queues */
	brcmu_pktq_flush(&bus->txq, true, NULL, NULL);

	/* Clear any held glomming stuff */
	if (bus->glomd)
		brcmu_pkt_buf_free_skb(bus->glomd);
2277
	brcmf_sdio_free_glom(bus);
2278 2279

	/* Clear rx control and wake any waiters */
2280
	spin_lock_bh(&bus->rxctl_lock);
2281
	bus->rxlen = 0;
2282
	spin_unlock_bh(&bus->rxctl_lock);
2283
	brcmf_sdio_dcmd_resp_wake(bus);
2284 2285 2286 2287 2288 2289

	/* Reset some F2 state stuff */
	bus->rxskip = false;
	bus->tx_seq = bus->rx_seq = 0;
}

2290
static inline void brcmf_sdio_clrintr(struct brcmf_sdio *bus)
2291 2292 2293
{
	unsigned long flags;

2294 2295 2296 2297 2298 2299 2300
	if (bus->sdiodev->oob_irq_requested) {
		spin_lock_irqsave(&bus->sdiodev->irq_en_lock, flags);
		if (!bus->sdiodev->irq_en && !atomic_read(&bus->ipend)) {
			enable_irq(bus->sdiodev->pdata->oob_irq_nr);
			bus->sdiodev->irq_en = true;
		}
		spin_unlock_irqrestore(&bus->sdiodev->irq_en_lock, flags);
2301 2302 2303
	}
}

2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314
static int brcmf_sdio_intr_rstatus(struct brcmf_sdio *bus)
{
	u8 idx;
	u32 addr;
	unsigned long val;
	int n, ret;

	idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV);
	addr = bus->ci->c_inf[idx].base +
	       offsetof(struct sdpcmd_regs, intstatus);

2315
	val = brcmf_sdiod_regrl(bus->sdiodev, addr, &ret);
2316 2317 2318 2319 2320 2321 2322 2323 2324
	bus->sdcnt.f1regdata++;
	if (ret != 0)
		val = 0;

	val &= bus->hostintmask;
	atomic_set(&bus->fcstate, !!(val & I_HMB_FC_STATE));

	/* Clear interrupts */
	if (val) {
2325
		brcmf_sdiod_regwl(bus->sdiodev, addr, val, &ret);
2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338
		bus->sdcnt.f1regdata++;
	}

	if (ret) {
		atomic_set(&bus->intstatus, 0);
	} else if (val) {
		for_each_set_bit(n, &val, 32)
			set_bit(n, (unsigned long *)&bus->intstatus.counter);
	}

	return ret;
}

2339
static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
2340
{
2341 2342
	u32 newstatus = 0;
	unsigned long intstatus;
2343 2344 2345
	uint rxlimit = bus->rxbound;	/* Rx frames to read before resched */
	uint txlimit = bus->txbound;	/* Tx frames to send before resched */
	uint framecnt = 0;	/* Temporary counter of tx/rx frames */
2346
	int err = 0, n;
2347 2348 2349

	brcmf_dbg(TRACE, "Enter\n");

2350
	sdio_claim_host(bus->sdiodev->func[1]);
2351 2352

	/* If waiting for HTAVAIL, check status */
2353
	if (!bus->sr_enabled && bus->clkstate == CLK_PENDING) {
2354 2355
		u8 clkctl, devctl = 0;

J
Joe Perches 已提交
2356
#ifdef DEBUG
2357
		/* Check for inconsistent device control */
2358 2359
		devctl = brcmf_sdiod_regrb(bus->sdiodev,
					   SBSDIO_DEVICE_CTL, &err);
2360
		if (err) {
2361
			brcmf_err("error reading DEVCTL: %d\n", err);
2362
			bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2363
		}
J
Joe Perches 已提交
2364
#endif				/* DEBUG */
2365 2366

		/* Read CSR, if clock on switch to AVAIL, else ignore */
2367 2368
		clkctl = brcmf_sdiod_regrb(bus->sdiodev,
					   SBSDIO_FUNC1_CHIPCLKCSR, &err);
2369
		if (err) {
2370
			brcmf_err("error reading CSR: %d\n",
2371
				  err);
2372
			bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2373 2374
		}

2375
		brcmf_dbg(SDIO, "DPC: PENDING, devctl 0x%02x clkctl 0x%02x\n",
2376 2377 2378
			  devctl, clkctl);

		if (SBSDIO_HTAV(clkctl)) {
2379 2380
			devctl = brcmf_sdiod_regrb(bus->sdiodev,
						   SBSDIO_DEVICE_CTL, &err);
2381
			if (err) {
2382
				brcmf_err("error reading DEVCTL: %d\n",
2383
					  err);
2384
				bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2385 2386
			}
			devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY;
2387 2388
			brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL,
					  devctl, &err);
2389
			if (err) {
2390
				brcmf_err("error writing DEVCTL: %d\n",
2391
					  err);
2392
				bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2393 2394 2395 2396 2397 2398
			}
			bus->clkstate = CLK_AVAIL;
		}
	}

	/* Make sure backplane clock is on */
2399
	brcmf_sdio_bus_sleep(bus, false, true);
2400 2401

	/* Pending interrupt indicates new device status */
2402 2403
	if (atomic_read(&bus->ipend) > 0) {
		atomic_set(&bus->ipend, 0);
2404
		err = brcmf_sdio_intr_rstatus(bus);
2405 2406
	}

2407 2408
	/* Start with leftover status bits */
	intstatus = atomic_xchg(&bus->intstatus, 0);
2409 2410 2411 2412 2413 2414 2415

	/* Handle flow-control change: read new state in case our ack
	 * crossed another change interrupt.  If change still set, assume
	 * FC ON for safety, let next loop through do the debounce.
	 */
	if (intstatus & I_HMB_FC_CHANGE) {
		intstatus &= ~I_HMB_FC_CHANGE;
2416 2417
		err = w_sdreg32(bus, I_HMB_FC_CHANGE,
				offsetof(struct sdpcmd_regs, intstatus));
2418

2419 2420
		err = r_sdreg32(bus, &newstatus,
				offsetof(struct sdpcmd_regs, intstatus));
2421
		bus->sdcnt.f1regdata += 2;
2422 2423
		atomic_set(&bus->fcstate,
			   !!(newstatus & (I_HMB_FC_STATE | I_HMB_FC_CHANGE)));
2424 2425 2426 2427 2428 2429
		intstatus |= (newstatus & bus->hostintmask);
	}

	/* Handle host mailbox indication */
	if (intstatus & I_HMB_HOST_INT) {
		intstatus &= ~I_HMB_HOST_INT;
2430
		intstatus |= brcmf_sdio_hostmail(bus);
2431 2432
	}

2433
	sdio_release_host(bus->sdiodev->func[1]);
2434

2435 2436
	/* Generally don't ask for these, can get CRC errors... */
	if (intstatus & I_WR_OOSYNC) {
2437
		brcmf_err("Dongle reports WR_OOSYNC\n");
2438 2439 2440 2441
		intstatus &= ~I_WR_OOSYNC;
	}

	if (intstatus & I_RD_OOSYNC) {
2442
		brcmf_err("Dongle reports RD_OOSYNC\n");
2443 2444 2445 2446
		intstatus &= ~I_RD_OOSYNC;
	}

	if (intstatus & I_SBINT) {
2447
		brcmf_err("Dongle reports SBINT\n");
2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461
		intstatus &= ~I_SBINT;
	}

	/* Would be active due to wake-wlan in gSPI */
	if (intstatus & I_CHIPACTIVE) {
		brcmf_dbg(INFO, "Dongle reports CHIPACTIVE\n");
		intstatus &= ~I_CHIPACTIVE;
	}

	/* Ignore frame indications if rxskip is set */
	if (bus->rxskip)
		intstatus &= ~I_HMB_FRAME_IND;

	/* On frame indication, read available frames */
F
Franky Lin 已提交
2462
	if (PKT_AVAILABLE() && bus->clkstate == CLK_AVAIL) {
2463 2464
		framecnt = brcmf_sdio_readframes(bus, rxlimit);
		if (!bus->rxpending)
2465 2466 2467 2468 2469
			intstatus &= ~I_HMB_FRAME_IND;
		rxlimit -= min(framecnt, rxlimit);
	}

	/* Keep still-pending events for next scheduling */
2470 2471 2472 2473
	if (intstatus) {
		for_each_set_bit(n, &intstatus, 32)
			set_bit(n, (unsigned long *)&bus->intstatus.counter);
	}
2474

2475
	brcmf_sdio_clrintr(bus);
2476

2477 2478
	if (data_ok(bus) && bus->ctrl_frame_stat &&
		(bus->clkstate == CLK_AVAIL)) {
F
Franky Lin 已提交
2479
		int i;
2480

2481
		sdio_claim_host(bus->sdiodev->func[1]);
2482
		err = brcmf_sdiod_send_buf(bus->sdiodev, bus->ctrl_frame_buf,
2483
					   (u32)bus->ctrl_frame_len);
2484

F
Franky Lin 已提交
2485
		if (err < 0) {
2486 2487 2488
			/* On failure, abort the command and
				terminate the frame */
			brcmf_dbg(INFO, "sdio error %d, abort command and terminate frame\n",
F
Franky Lin 已提交
2489
				  err);
2490
			bus->sdcnt.tx_sderrs++;
2491

2492
			brcmf_sdiod_abort(bus->sdiodev, SDIO_FUNC_2);
2493

2494 2495
			brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL,
					  SFC_WF_TERM, &err);
2496
			bus->sdcnt.f1regdata++;
2497 2498 2499

			for (i = 0; i < 3; i++) {
				u8 hi, lo;
2500 2501 2502 2503 2504 2505
				hi = brcmf_sdiod_regrb(bus->sdiodev,
						       SBSDIO_FUNC1_WFRAMEBCHI,
						       &err);
				lo = brcmf_sdiod_regrb(bus->sdiodev,
						       SBSDIO_FUNC1_WFRAMEBCLO,
						       &err);
2506
				bus->sdcnt.f1regdata += 2;
2507 2508 2509 2510
				if ((hi == 0) && (lo == 0))
					break;
			}

F
Franky Lin 已提交
2511
		} else {
2512
			bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQ_WRAP;
F
Franky Lin 已提交
2513
		}
2514
		sdio_release_host(bus->sdiodev->func[1]);
2515
		bus->ctrl_frame_stat = false;
2516
		brcmf_sdio_wait_event_wakeup(bus);
2517 2518
	}
	/* Send queued frames (limit 1 if rx may still be pending) */
2519
	else if ((bus->clkstate == CLK_AVAIL) && !atomic_read(&bus->fcstate) &&
2520 2521
		 brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) && txlimit
		 && data_ok(bus)) {
2522 2523
		framecnt = bus->rxpending ? min(txlimit, bus->txminmax) :
					    txlimit;
2524
		framecnt = brcmf_sdio_sendfromq(bus, framecnt);
2525 2526 2527
		txlimit -= framecnt;
	}

2528
	if ((bus->sdiodev->bus_if->state == BRCMF_BUS_DOWN) || (err != 0)) {
2529
		brcmf_err("failed backplane access over SDIO, halting operation\n");
2530
		bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2531 2532 2533 2534 2535 2536
		atomic_set(&bus->intstatus, 0);
	} else if (atomic_read(&bus->intstatus) ||
		   atomic_read(&bus->ipend) > 0 ||
		   (!atomic_read(&bus->fcstate) &&
		    brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) &&
		    data_ok(bus)) || PKT_AVAILABLE()) {
2537
		atomic_inc(&bus->dpc_tskcnt);
2538 2539 2540 2541 2542 2543
	}

	/* If we're done for now, turn off clock request. */
	if ((bus->clkstate != CLK_PENDING)
	    && bus->idletime == BRCMF_IDLE_IMMEDIATE) {
		bus->activity = false;
2544
		brcmf_dbg(SDIO, "idle state\n");
2545
		sdio_claim_host(bus->sdiodev->func[1]);
2546
		brcmf_sdio_bus_sleep(bus, true, false);
2547
		sdio_release_host(bus->sdiodev->func[1]);
2548 2549 2550
	}
}

2551
static struct pktq *brcmf_sdio_bus_gettxq(struct device *dev)
2552 2553 2554 2555 2556 2557 2558 2559
{
	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
	struct brcmf_sdio *bus = sdiodev->bus;

	return &bus->txq;
}

2560
static int brcmf_sdio_bus_txdata(struct device *dev, struct sk_buff *pkt)
2561 2562 2563
{
	int ret = -EBADE;
	uint datalen, prec;
2564
	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
2565
	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
2566
	struct brcmf_sdio *bus = sdiodev->bus;
2567
	ulong flags;
2568 2569 2570 2571 2572 2573

	brcmf_dbg(TRACE, "Enter\n");

	datalen = pkt->len;

	/* Add space for the header */
2574
	skb_push(pkt, bus->tx_hdrlen);
2575 2576 2577 2578 2579 2580 2581
	/* precondition: IS_ALIGNED((unsigned long)(pkt->data), 2) */

	prec = prio2prec((pkt->priority & PRIOMASK));

	/* Check for existing queue, current flow-control,
			 pending event, or pending clock */
	brcmf_dbg(TRACE, "deferring pktq len %d\n", pktq_len(&bus->txq));
2582
	bus->sdcnt.fcqueued++;
2583 2584

	/* Priority based enq */
2585
	spin_lock_irqsave(&bus->txqlock, flags);
2586
	if (!brcmf_c_prec_enq(bus->sdiodev->dev, &bus->txq, pkt, prec)) {
2587
		skb_pull(pkt, bus->tx_hdrlen);
2588
		brcmf_err("out of bus->txq !!!\n");
2589 2590 2591 2592 2593
		ret = -ENOSR;
	} else {
		ret = 0;
	}

2594
	if (pktq_len(&bus->txq) >= TXHI) {
2595 2596
		bus->txoff = true;
		brcmf_txflowblock(bus->sdiodev->dev, true);
2597
	}
2598
	spin_unlock_irqrestore(&bus->txqlock, flags);
2599

J
Joe Perches 已提交
2600
#ifdef DEBUG
2601 2602 2603
	if (pktq_plen(&bus->txq, prec) > qcount[prec])
		qcount[prec] = pktq_plen(&bus->txq, prec);
#endif
2604

2605 2606
	if (atomic_read(&bus->dpc_tskcnt) == 0) {
		atomic_inc(&bus->dpc_tskcnt);
2607
		queue_work(bus->brcmf_wq, &bus->datawork);
2608 2609 2610 2611 2612
	}

	return ret;
}

J
Joe Perches 已提交
2613
#ifdef DEBUG
2614 2615
#define CONSOLE_LINE_MAX	192

2616
static int brcmf_sdio_readconsole(struct brcmf_sdio *bus)
2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628
{
	struct brcmf_console *c = &bus->console;
	u8 line[CONSOLE_LINE_MAX], ch;
	u32 n, idx, addr;
	int rv;

	/* Don't do anything until FWREADY updates console address */
	if (bus->console_addr == 0)
		return 0;

	/* Read console log struct */
	addr = bus->console_addr + offsetof(struct rte_console, log_le);
2629 2630
	rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, (u8 *)&c->log_le,
			       sizeof(c->log_le));
2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654
	if (rv < 0)
		return rv;

	/* Allocate console buffer (one time only) */
	if (c->buf == NULL) {
		c->bufsize = le32_to_cpu(c->log_le.buf_size);
		c->buf = kmalloc(c->bufsize, GFP_ATOMIC);
		if (c->buf == NULL)
			return -ENOMEM;
	}

	idx = le32_to_cpu(c->log_le.idx);

	/* Protect against corrupt value */
	if (idx > c->bufsize)
		return -EBADE;

	/* Skip reading the console buffer if the index pointer
	 has not moved */
	if (idx == c->last)
		return 0;

	/* Read the console buffer */
	addr = le32_to_cpu(c->log_le.buf);
2655
	rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, c->buf, c->bufsize);
2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683
	if (rv < 0)
		return rv;

	while (c->last != idx) {
		for (n = 0; n < CONSOLE_LINE_MAX - 2; n++) {
			if (c->last == idx) {
				/* This would output a partial line.
				 * Instead, back up
				 * the buffer pointer and output this
				 * line next time around.
				 */
				if (c->last >= n)
					c->last -= n;
				else
					c->last = c->bufsize - n;
				goto break2;
			}
			ch = c->buf[c->last];
			c->last = (c->last + 1) % c->bufsize;
			if (ch == '\n')
				break;
			line[n] = ch;
		}

		if (n > 0) {
			if (line[n - 1] == '\r')
				n--;
			line[n] = 0;
2684
			pr_debug("CONSOLE: %s\n", line);
2685 2686 2687 2688 2689 2690
		}
	}
break2:

	return 0;
}
J
Joe Perches 已提交
2691
#endif				/* DEBUG */
2692

2693
static int brcmf_sdio_tx_frame(struct brcmf_sdio *bus, u8 *frame, u16 len)
2694 2695 2696 2697 2698
{
	int i;
	int ret;

	bus->ctrl_frame_stat = false;
2699
	ret = brcmf_sdiod_send_buf(bus->sdiodev, frame, len);
2700 2701 2702 2703 2704

	if (ret < 0) {
		/* On failure, abort the command and terminate the frame */
		brcmf_dbg(INFO, "sdio error %d, abort command and terminate frame\n",
			  ret);
2705
		bus->sdcnt.tx_sderrs++;
2706

2707
		brcmf_sdiod_abort(bus->sdiodev, SDIO_FUNC_2);
2708

2709 2710
		brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL,
				  SFC_WF_TERM, NULL);
2711
		bus->sdcnt.f1regdata++;
2712 2713 2714

		for (i = 0; i < 3; i++) {
			u8 hi, lo;
2715 2716 2717 2718
			hi = brcmf_sdiod_regrb(bus->sdiodev,
					       SBSDIO_FUNC1_WFRAMEBCHI, NULL);
			lo = brcmf_sdiod_regrb(bus->sdiodev,
					       SBSDIO_FUNC1_WFRAMEBCLO, NULL);
2719
			bus->sdcnt.f1regdata += 2;
2720 2721 2722 2723 2724 2725
			if (hi == 0 && lo == 0)
				break;
		}
		return ret;
	}

2726
	bus->tx_seq = (bus->tx_seq + 1) % SDPCM_SEQ_WRAP;
2727 2728 2729 2730

	return ret;
}

2731
static int
2732
brcmf_sdio_bus_txctl(struct device *dev, unsigned char *msg, uint msglen)
2733 2734
{
	u8 *frame;
2735
	u16 len, pad;
2736 2737 2738
	uint retries = 0;
	u8 doff = 0;
	int ret = -1;
2739
	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
2740
	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
2741
	struct brcmf_sdio *bus = sdiodev->bus;
2742
	struct brcmf_sdio_hdrinfo hd_info = {0};
2743 2744 2745 2746

	brcmf_dbg(TRACE, "Enter\n");

	/* Back the pointer to make a room for bus header */
2747 2748
	frame = msg - bus->tx_hdrlen;
	len = (msglen += bus->tx_hdrlen);
2749 2750

	/* Add alignment padding (optional for ctl frames) */
2751
	doff = ((unsigned long)frame % bus->head_align);
2752 2753 2754 2755
	if (doff) {
		frame -= doff;
		len += doff;
		msglen += doff;
2756
		memset(frame, 0, doff + bus->tx_hdrlen);
2757
	}
2758
	/* precondition: doff < bus->head_align */
2759
	doff += bus->tx_hdrlen;
2760 2761

	/* Round send length to next SDIO block */
2762
	pad = 0;
2763
	if (bus->roundup && bus->blocksize && (len > bus->blocksize)) {
2764 2765 2766
		pad = bus->blocksize - (len % bus->blocksize);
		if ((pad > bus->roundup) || (pad >= bus->blocksize))
			pad = 0;
2767 2768
	} else if (len % bus->head_align) {
		pad = bus->head_align - (len % bus->head_align);
2769
	}
2770
	len += pad;
2771 2772 2773 2774

	/* precondition: IS_ALIGNED((unsigned long)frame, 2) */

	/* Make sure backplane clock is on */
2775
	sdio_claim_host(bus->sdiodev->func[1]);
2776
	brcmf_sdio_bus_sleep(bus, false, false);
2777
	sdio_release_host(bus->sdiodev->func[1]);
2778

2779 2780 2781
	hd_info.len = (u16)msglen;
	hd_info.channel = SDPCM_CONTROL_CHANNEL;
	hd_info.dat_offset = doff;
2782
	hd_info.seq_num = bus->tx_seq;
2783 2784
	hd_info.lastfrm = true;
	hd_info.tail_pad = pad;
2785
	brcmf_sdio_hdpack(bus, frame, &hd_info);
2786

2787 2788 2789
	if (bus->txglom)
		brcmf_sdio_update_hwhdr(frame, len);

2790 2791 2792 2793 2794 2795 2796 2797
	if (!data_ok(bus)) {
		brcmf_dbg(INFO, "No bus credit bus->tx_max %d, bus->tx_seq %d\n",
			  bus->tx_max, bus->tx_seq);
		bus->ctrl_frame_stat = true;
		/* Send from dpc */
		bus->ctrl_frame_buf = frame;
		bus->ctrl_frame_len = len;

2798 2799 2800
		wait_event_interruptible_timeout(bus->ctrl_wait,
						 !bus->ctrl_frame_stat,
						 msecs_to_jiffies(2000));
2801

2802
		if (!bus->ctrl_frame_stat) {
2803
			brcmf_dbg(SDIO, "ctrl_frame_stat == false\n");
2804 2805
			ret = 0;
		} else {
2806
			brcmf_dbg(SDIO, "ctrl_frame_stat == true\n");
2807 2808 2809 2810 2811
			ret = -1;
		}
	}

	if (ret == -1) {
2812 2813 2814 2815 2816
		brcmf_dbg_hex_dump(BRCMF_BYTES_ON() && BRCMF_CTL_ON(),
				   frame, len, "Tx Frame:\n");
		brcmf_dbg_hex_dump(!(BRCMF_BYTES_ON() && BRCMF_CTL_ON()) &&
				   BRCMF_HDRS_ON(),
				   frame, min_t(u16, len, 16), "TxHdr:\n");
2817 2818

		do {
2819
			sdio_claim_host(bus->sdiodev->func[1]);
2820
			ret = brcmf_sdio_tx_frame(bus, frame, len);
2821
			sdio_release_host(bus->sdiodev->func[1]);
2822 2823 2824
		} while (ret < 0 && retries++ < TXRETRIES);
	}

2825
	if ((bus->idletime == BRCMF_IDLE_IMMEDIATE) &&
2826
	    atomic_read(&bus->dpc_tskcnt) == 0) {
2827
		bus->activity = false;
2828
		sdio_claim_host(bus->sdiodev->func[1]);
2829
		brcmf_dbg(INFO, "idle\n");
2830
		brcmf_sdio_clkctl(bus, CLK_NONE, true);
2831
		sdio_release_host(bus->sdiodev->func[1]);
2832 2833 2834
	}

	if (ret)
2835
		bus->sdcnt.tx_ctlerrs++;
2836
	else
2837
		bus->sdcnt.tx_ctlpkts++;
2838 2839 2840 2841

	return ret ? -EIO : 0;
}

2842
#ifdef DEBUG
2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856
static inline bool brcmf_sdio_valid_shared_address(u32 addr)
{
	return !(addr == 0 || ((~addr >> 16) & 0xffff) == (addr & 0xffff));
}

static int brcmf_sdio_readshared(struct brcmf_sdio *bus,
				 struct sdpcm_shared *sh)
{
	u32 addr;
	int rv;
	u32 shaddr = 0;
	struct sdpcm_shared_le sh_le;
	__le32 addr_le;

2857
	shaddr = bus->ci->rambase + bus->ramsize - 4;
2858 2859 2860 2861 2862

	/*
	 * Read last word in socram to determine
	 * address of sdpcm_shared structure
	 */
2863
	sdio_claim_host(bus->sdiodev->func[1]);
2864
	brcmf_sdio_bus_sleep(bus, false, false);
2865
	rv = brcmf_sdiod_ramrw(bus->sdiodev, false, shaddr, (u8 *)&addr_le, 4);
2866
	sdio_release_host(bus->sdiodev->func[1]);
2867 2868 2869 2870 2871
	if (rv < 0)
		return rv;

	addr = le32_to_cpu(addr_le);

2872
	brcmf_dbg(SDIO, "sdpcm_shared address 0x%08X\n", addr);
2873 2874 2875 2876 2877 2878

	/*
	 * Check if addr is valid.
	 * NVRAM length at the end of memory should have been overwritten.
	 */
	if (!brcmf_sdio_valid_shared_address(addr)) {
2879
			brcmf_err("invalid sdpcm_shared address 0x%08X\n",
2880 2881 2882 2883 2884
				  addr);
			return -EINVAL;
	}

	/* Read hndrte_shared structure */
2885 2886
	rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, (u8 *)&sh_le,
			       sizeof(struct sdpcm_shared_le));
2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898
	if (rv < 0)
		return rv;

	/* Endianness */
	sh->flags = le32_to_cpu(sh_le.flags);
	sh->trap_addr = le32_to_cpu(sh_le.trap_addr);
	sh->assert_exp_addr = le32_to_cpu(sh_le.assert_exp_addr);
	sh->assert_file_addr = le32_to_cpu(sh_le.assert_file_addr);
	sh->assert_line = le32_to_cpu(sh_le.assert_line);
	sh->console_addr = le32_to_cpu(sh_le.console_addr);
	sh->msgtrace_addr = le32_to_cpu(sh_le.msgtrace_addr);

2899 2900
	if ((sh->flags & SDPCM_SHARED_VERSION_MASK) > SDPCM_SHARED_VERSION) {
		brcmf_err("sdpcm shared version unsupported: dhd %d dongle %d\n",
2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921
			  SDPCM_SHARED_VERSION,
			  sh->flags & SDPCM_SHARED_VERSION_MASK);
		return -EPROTO;
	}

	return 0;
}

static int brcmf_sdio_dump_console(struct brcmf_sdio *bus,
				   struct sdpcm_shared *sh, char __user *data,
				   size_t count)
{
	u32 addr, console_ptr, console_size, console_index;
	char *conbuf = NULL;
	__le32 sh_val;
	int rv;
	loff_t pos = 0;
	int nbytes = 0;

	/* obtain console information from device memory */
	addr = sh->console_addr + offsetof(struct rte_console, log_le);
2922 2923
	rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr,
			       (u8 *)&sh_val, sizeof(u32));
2924 2925 2926 2927 2928
	if (rv < 0)
		return rv;
	console_ptr = le32_to_cpu(sh_val);

	addr = sh->console_addr + offsetof(struct rte_console, log_le.buf_size);
2929 2930
	rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr,
			       (u8 *)&sh_val, sizeof(u32));
2931 2932 2933 2934 2935
	if (rv < 0)
		return rv;
	console_size = le32_to_cpu(sh_val);

	addr = sh->console_addr + offsetof(struct rte_console, log_le.idx);
2936 2937
	rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr,
			       (u8 *)&sh_val, sizeof(u32));
2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950
	if (rv < 0)
		return rv;
	console_index = le32_to_cpu(sh_val);

	/* allocate buffer for console data */
	if (console_size <= CONSOLE_BUFFER_MAX)
		conbuf = vzalloc(console_size+1);

	if (!conbuf)
		return -ENOMEM;

	/* obtain the console data from device */
	conbuf[console_size] = '\0';
2951 2952
	rv = brcmf_sdiod_ramrw(bus->sdiodev, false, console_ptr, (u8 *)conbuf,
			       console_size);
2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983
	if (rv < 0)
		goto done;

	rv = simple_read_from_buffer(data, count, &pos,
				     conbuf + console_index,
				     console_size - console_index);
	if (rv < 0)
		goto done;

	nbytes = rv;
	if (console_index > 0) {
		pos = 0;
		rv = simple_read_from_buffer(data+nbytes, count, &pos,
					     conbuf, console_index - 1);
		if (rv < 0)
			goto done;
		rv += nbytes;
	}
done:
	vfree(conbuf);
	return rv;
}

static int brcmf_sdio_trap_info(struct brcmf_sdio *bus, struct sdpcm_shared *sh,
				char __user *data, size_t count)
{
	int error, res;
	char buf[350];
	struct brcmf_trap_info tr;
	loff_t pos = 0;

2984 2985
	if ((sh->flags & SDPCM_SHARED_TRAP) == 0) {
		brcmf_dbg(INFO, "no trap in firmware\n");
2986
		return 0;
2987
	}
2988

2989 2990
	error = brcmf_sdiod_ramrw(bus->sdiodev, false, sh->trap_addr, (u8 *)&tr,
				  sizeof(struct brcmf_trap_info));
2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002
	if (error < 0)
		return error;

	res = scnprintf(buf, sizeof(buf),
			"dongle trap info: type 0x%x @ epc 0x%08x\n"
			"  cpsr 0x%08x spsr 0x%08x sp 0x%08x\n"
			"  lr   0x%08x pc   0x%08x offset 0x%x\n"
			"  r0   0x%08x r1   0x%08x r2 0x%08x r3 0x%08x\n"
			"  r4   0x%08x r5   0x%08x r6 0x%08x r7 0x%08x\n",
			le32_to_cpu(tr.type), le32_to_cpu(tr.epc),
			le32_to_cpu(tr.cpsr), le32_to_cpu(tr.spsr),
			le32_to_cpu(tr.r13), le32_to_cpu(tr.r14),
3003
			le32_to_cpu(tr.pc), sh->trap_addr,
3004 3005 3006 3007 3008
			le32_to_cpu(tr.r0), le32_to_cpu(tr.r1),
			le32_to_cpu(tr.r2), le32_to_cpu(tr.r3),
			le32_to_cpu(tr.r4), le32_to_cpu(tr.r5),
			le32_to_cpu(tr.r6), le32_to_cpu(tr.r7));

3009
	return simple_read_from_buffer(data, count, &pos, buf, res);
3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030
}

static int brcmf_sdio_assert_info(struct brcmf_sdio *bus,
				  struct sdpcm_shared *sh, char __user *data,
				  size_t count)
{
	int error = 0;
	char buf[200];
	char file[80] = "?";
	char expr[80] = "<???>";
	int res;
	loff_t pos = 0;

	if ((sh->flags & SDPCM_SHARED_ASSERT_BUILT) == 0) {
		brcmf_dbg(INFO, "firmware not built with -assert\n");
		return 0;
	} else if ((sh->flags & SDPCM_SHARED_ASSERT) == 0) {
		brcmf_dbg(INFO, "no assert in dongle\n");
		return 0;
	}

3031
	sdio_claim_host(bus->sdiodev->func[1]);
3032
	if (sh->assert_file_addr != 0) {
3033 3034
		error = brcmf_sdiod_ramrw(bus->sdiodev, false,
					  sh->assert_file_addr, (u8 *)file, 80);
3035 3036 3037 3038
		if (error < 0)
			return error;
	}
	if (sh->assert_exp_addr != 0) {
3039 3040
		error = brcmf_sdiod_ramrw(bus->sdiodev, false,
					  sh->assert_exp_addr, (u8 *)expr, 80);
3041 3042 3043
		if (error < 0)
			return error;
	}
3044
	sdio_release_host(bus->sdiodev->func[1]);
3045 3046 3047 3048 3049 3050 3051

	res = scnprintf(buf, sizeof(buf),
			"dongle assert: %s:%d: assert(%s)\n",
			file, sh->assert_line, expr);
	return simple_read_from_buffer(data, count, &pos, buf, res);
}

3052
static int brcmf_sdio_checkdied(struct brcmf_sdio *bus)
3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064
{
	int error;
	struct sdpcm_shared sh;

	error = brcmf_sdio_readshared(bus, &sh);

	if (error < 0)
		return error;

	if ((sh.flags & SDPCM_SHARED_ASSERT_BUILT) == 0)
		brcmf_dbg(INFO, "firmware not built with -assert\n");
	else if (sh.flags & SDPCM_SHARED_ASSERT)
3065
		brcmf_err("assertion in dongle\n");
3066 3067

	if (sh.flags & SDPCM_SHARED_TRAP)
3068
		brcmf_err("firmware trap in dongle\n");
3069 3070 3071 3072

	return 0;
}

3073 3074
static int brcmf_sdio_died_dump(struct brcmf_sdio *bus, char __user *data,
				size_t count, loff_t *ppos)
3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091
{
	int error = 0;
	struct sdpcm_shared sh;
	int nbytes = 0;
	loff_t pos = *ppos;

	if (pos != 0)
		return 0;

	error = brcmf_sdio_readshared(bus, &sh);
	if (error < 0)
		goto done;

	error = brcmf_sdio_assert_info(bus, &sh, data, count);
	if (error < 0)
		goto done;
	nbytes = error;
3092 3093

	error = brcmf_sdio_trap_info(bus, &sh, data+nbytes, count);
3094 3095
	if (error < 0)
		goto done;
3096 3097 3098 3099 3100 3101
	nbytes += error;

	error = brcmf_sdio_dump_console(bus, &sh, data+nbytes, count);
	if (error < 0)
		goto done;
	nbytes += error;
3102

3103 3104
	error = nbytes;
	*ppos += nbytes;
3105 3106 3107 3108 3109 3110 3111 3112 3113 3114
done:
	return error;
}

static ssize_t brcmf_sdio_forensic_read(struct file *f, char __user *data,
					size_t count, loff_t *ppos)
{
	struct brcmf_sdio *bus = f->private_data;
	int res;

3115
	res = brcmf_sdio_died_dump(bus, data, count, ppos);
3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126
	if (res > 0)
		*ppos += res;
	return (ssize_t)res;
}

static const struct file_operations brcmf_sdio_forensic_ops = {
	.owner = THIS_MODULE,
	.open = simple_open,
	.read = brcmf_sdio_forensic_read
};

3127 3128 3129
static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus)
{
	struct brcmf_pub *drvr = bus->sdiodev->bus_if->drvr;
3130
	struct dentry *dentry = brcmf_debugfs_get_devdir(drvr);
3131

3132 3133 3134 3135 3136
	if (IS_ERR_OR_NULL(dentry))
		return;

	debugfs_create_file("forensics", S_IRUGO, dentry, bus,
			    &brcmf_sdio_forensic_ops);
3137 3138 3139
	brcmf_debugfs_create_sdio_count(drvr, &bus->sdcnt);
}
#else
3140
static int brcmf_sdio_checkdied(struct brcmf_sdio *bus)
3141 3142 3143 3144
{
	return 0;
}

3145 3146 3147 3148 3149
static void brcmf_sdio_debugfs_create(struct brcmf_sdio *bus)
{
}
#endif /* DEBUG */

3150
static int
3151
brcmf_sdio_bus_rxctl(struct device *dev, unsigned char *msg, uint msglen)
3152 3153 3154 3155
{
	int timeleft;
	uint rxlen = 0;
	bool pending;
3156
	u8 *buf;
3157
	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
3158
	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
3159
	struct brcmf_sdio *bus = sdiodev->bus;
3160 3161 3162 3163

	brcmf_dbg(TRACE, "Enter\n");

	/* Wait until control frame is available */
3164
	timeleft = brcmf_sdio_dcmd_resp_wait(bus, &bus->rxlen, &pending);
3165

3166
	spin_lock_bh(&bus->rxctl_lock);
3167 3168
	rxlen = bus->rxlen;
	memcpy(msg, bus->rxctl, min(msglen, rxlen));
3169 3170 3171
	bus->rxctl = NULL;
	buf = bus->rxctl_orig;
	bus->rxctl_orig = NULL;
3172
	bus->rxlen = 0;
3173 3174
	spin_unlock_bh(&bus->rxctl_lock);
	vfree(buf);
3175 3176 3177 3178 3179

	if (rxlen) {
		brcmf_dbg(CTL, "resumed on rxctl frame, got %d expected %d\n",
			  rxlen, msglen);
	} else if (timeleft == 0) {
3180
		brcmf_err("resumed on timeout\n");
3181
		brcmf_sdio_checkdied(bus);
3182
	} else if (pending) {
3183 3184 3185 3186
		brcmf_dbg(CTL, "cancelled\n");
		return -ERESTARTSYS;
	} else {
		brcmf_dbg(CTL, "resumed for unknown reason?\n");
3187
		brcmf_sdio_checkdied(bus);
3188 3189 3190
	}

	if (rxlen)
3191
		bus->sdcnt.rx_ctlpkts++;
3192
	else
3193
		bus->sdcnt.rx_ctlerrs++;
3194 3195 3196 3197

	return rxlen ? (int)rxlen : -ETIMEDOUT;
}

3198
static bool brcmf_sdio_download_state(struct brcmf_sdio *bus, bool enter)
3199
{
3200
	struct chip_info *ci = bus->ci;
3201 3202 3203 3204 3205 3206 3207

	/* To enter download state, disable ARM and reset SOCRAM.
	 * To exit download state, simply reset ARM (default is RAM boot).
	 */
	if (enter) {
		bus->alp_only = true;

3208
		brcmf_sdio_chip_enter_download(bus->sdiodev, ci);
3209
	} else {
3210 3211 3212
		if (!brcmf_sdio_chip_exit_download(bus->sdiodev, ci, bus->vars,
						   bus->varsz))
			return false;
3213 3214 3215 3216

		/* Allow HT Clock now that the ARM is running. */
		bus->alp_only = false;

3217
		bus->sdiodev->bus_if->state = BRCMF_BUS_LOAD;
3218
	}
3219 3220

	return true;
3221 3222
}

3223
static int brcmf_sdio_download_code_file(struct brcmf_sdio *bus)
3224
{
3225 3226
	const struct firmware *fw;
	int err;
3227
	int offset;
3228 3229 3230
	int address;
	int len;

3231
	fw = brcmf_sdio_get_fw(bus, BRCMF_FIRMWARE_BIN);
3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244
	if (fw == NULL)
		return -ENOENT;

	if (brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_ARM_CR4) !=
	    BRCMF_MAX_CORENUM)
		memcpy(&bus->ci->rst_vec, fw->data, sizeof(bus->ci->rst_vec));

	err = 0;
	offset = 0;
	address = bus->ci->rambase;
	while (offset < fw->size) {
		len = ((offset + MEMBLOCK) < fw->size) ? MEMBLOCK :
		      fw->size - offset;
3245 3246
		err = brcmf_sdiod_ramrw(bus->sdiodev, true, address,
					(u8 *)&fw->data[offset], len);
3247
		if (err) {
3248
			brcmf_err("error %d on writing %d membytes at 0x%08x\n",
3249 3250
				  err, len, address);
			goto failure;
3251
		}
3252 3253
		offset += len;
		address += len;
3254 3255
	}

3256 3257
failure:
	release_firmware(fw);
3258

3259
	return err;
3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270
}

/*
 * ProcessVars:Takes a buffer of "<var>=<value>\n" lines read from a file
 * and ending in a NUL.
 * Removes carriage returns, empty lines, comment lines, and converts
 * newlines to NULs.
 * Shortens buffer as needed and pads with NULs.  End of buffer is marked
 * by two NULs.
*/

3271 3272
static int brcmf_sdio_strip_nvram(struct brcmf_sdio *bus,
				  const struct firmware *nv)
3273
{
3274
	char *varbuf;
3275 3276 3277
	char *dp;
	bool findNewline;
	int column;
3278 3279 3280
	int ret = 0;
	uint buf_len, n, len;

3281
	len = nv->size;
3282 3283 3284
	varbuf = vmalloc(len);
	if (!varbuf)
		return -ENOMEM;
3285

3286
	memcpy(varbuf, nv->data, len);
3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317
	dp = varbuf;

	findNewline = false;
	column = 0;

	for (n = 0; n < len; n++) {
		if (varbuf[n] == 0)
			break;
		if (varbuf[n] == '\r')
			continue;
		if (findNewline && varbuf[n] != '\n')
			continue;
		findNewline = false;
		if (varbuf[n] == '#') {
			findNewline = true;
			continue;
		}
		if (varbuf[n] == '\n') {
			if (column == 0)
				continue;
			*dp++ = 0;
			column = 0;
			continue;
		}
		*dp++ = varbuf[n];
		column++;
	}
	buf_len = dp - varbuf;
	while (dp < varbuf + n)
		*dp++ = 0;

3318
	kfree(bus->vars);
3319 3320
	/* roundup needed for download to device */
	bus->varsz = roundup(buf_len + 1, 4);
3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333
	bus->vars = kmalloc(bus->varsz, GFP_KERNEL);
	if (bus->vars == NULL) {
		bus->varsz = 0;
		ret = -ENOMEM;
		goto err;
	}

	/* copy the processed variables and add null termination */
	memcpy(bus->vars, varbuf, buf_len);
	bus->vars[buf_len] = 0;
err:
	vfree(varbuf);
	return ret;
3334 3335
}

3336
static int brcmf_sdio_download_nvram(struct brcmf_sdio *bus)
3337
{
3338
	const struct firmware *nv;
3339 3340
	int ret;

3341
	nv = brcmf_sdio_get_fw(bus, BRCMF_FIRMWARE_NVRAM);
3342 3343
	if (nv == NULL)
		return -ENOENT;
3344

3345
	ret = brcmf_sdio_strip_nvram(bus, nv);
3346

3347
	release_firmware(nv);
3348 3349 3350 3351

	return ret;
}

3352
static int brcmf_sdio_download_firmware(struct brcmf_sdio *bus)
3353
{
3354 3355 3356 3357 3358
	int bcmerror = -EFAULT;


	sdio_claim_host(bus->sdiodev->func[1]);
	brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
3359 3360

	/* Keep arm in reset */
3361
	if (!brcmf_sdio_download_state(bus, true)) {
3362
		brcmf_err("error placing ARM core in reset\n");
3363 3364 3365
		goto err;
	}

3366
	if (brcmf_sdio_download_code_file(bus)) {
3367
		brcmf_err("dongle image file download failed\n");
3368 3369 3370
		goto err;
	}

3371
	if (brcmf_sdio_download_nvram(bus)) {
3372
		brcmf_err("dongle nvram file download failed\n");
3373 3374
		goto err;
	}
3375 3376

	/* Take arm out of reset */
3377
	if (!brcmf_sdio_download_state(bus, false)) {
3378
		brcmf_err("error getting out of ARM core reset\n");
3379 3380 3381 3382 3383 3384
		goto err;
	}

	bcmerror = 0;

err:
3385 3386
	brcmf_sdio_clkctl(bus, CLK_SDONLY, false);
	sdio_release_host(bus->sdiodev->func[1]);
3387 3388 3389
	return bcmerror;
}

3390
static bool brcmf_sdio_sr_capable(struct brcmf_sdio *bus)
3391
{
3392 3393
	u32 addr, reg, pmu_cc3_mask = ~0;
	int err;
3394 3395 3396 3397 3398 3399 3400

	brcmf_dbg(TRACE, "Enter\n");

	/* old chips with PMU version less than 17 don't support save restore */
	if (bus->ci->pmurev < 17)
		return false;

3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415
	switch (bus->ci->chip) {
	case BCM43241_CHIP_ID:
	case BCM4335_CHIP_ID:
	case BCM4339_CHIP_ID:
		/* read PMU chipcontrol register 3 */
		addr = CORE_CC_REG(bus->ci->c_inf[0].base, chipcontrol_addr);
		brcmf_sdiod_regwl(bus->sdiodev, addr, 3, NULL);
		addr = CORE_CC_REG(bus->ci->c_inf[0].base, chipcontrol_data);
		reg = brcmf_sdiod_regrl(bus->sdiodev, addr, NULL);
		return (reg & pmu_cc3_mask) != 0;
	default:
		addr = CORE_CC_REG(bus->ci->c_inf[0].base, pmucapabilities_ext);
		reg = brcmf_sdiod_regrl(bus->sdiodev, addr, &err);
		if ((reg & PCAPEXT_SR_SUPPORTED_MASK) == 0)
			return false;
3416

3417 3418 3419 3420 3421
		addr = CORE_CC_REG(bus->ci->c_inf[0].base, retention_ctl);
		reg = brcmf_sdiod_regrl(bus->sdiodev, addr, NULL);
		return (reg & (PMU_RCTL_MACPHY_DISABLE_MASK |
			       PMU_RCTL_LOGIC_DISABLE_MASK)) == 0;
	}
3422 3423
}

3424
static void brcmf_sdio_sr_init(struct brcmf_sdio *bus)
3425 3426 3427 3428 3429 3430
{
	int err = 0;
	u8 val;

	brcmf_dbg(TRACE, "Enter\n");

3431
	val = brcmf_sdiod_regrb(bus->sdiodev, SBSDIO_FUNC1_WAKEUPCTRL, &err);
3432 3433 3434 3435 3436 3437
	if (err) {
		brcmf_err("error reading SBSDIO_FUNC1_WAKEUPCTRL\n");
		return;
	}

	val |= 1 << SBSDIO_FUNC1_WCTRL_HTWAIT_SHIFT;
3438
	brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_WAKEUPCTRL, val, &err);
3439 3440 3441 3442 3443 3444
	if (err) {
		brcmf_err("error writing SBSDIO_FUNC1_WAKEUPCTRL\n");
		return;
	}

	/* Add CMD14 Support */
3445 3446 3447 3448
	brcmf_sdiod_regwb(bus->sdiodev, SDIO_CCCR_BRCM_CARDCAP,
			  (SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT |
			   SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT),
			  &err);
3449 3450 3451 3452 3453
	if (err) {
		brcmf_err("error writing SDIO_CCCR_BRCM_CARDCAP\n");
		return;
	}

3454 3455
	brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
			  SBSDIO_FORCE_HT, &err);
3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466
	if (err) {
		brcmf_err("error writing SBSDIO_FUNC1_CHIPCLKCSR\n");
		return;
	}

	/* set flag */
	bus->sr_enabled = true;
	brcmf_dbg(INFO, "SR enabled\n");
}

/* enable KSO bit */
3467
static int brcmf_sdio_kso_init(struct brcmf_sdio *bus)
3468 3469 3470 3471 3472 3473 3474 3475 3476 3477
{
	u8 val;
	int err = 0;

	brcmf_dbg(TRACE, "Enter\n");

	/* KSO bit added in SDIO core rev 12 */
	if (bus->ci->c_inf[1].rev < 12)
		return 0;

3478
	val = brcmf_sdiod_regrb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, &err);
3479 3480 3481 3482 3483 3484 3485 3486
	if (err) {
		brcmf_err("error reading SBSDIO_FUNC1_SLEEPCSR\n");
		return err;
	}

	if (!(val & SBSDIO_FUNC1_SLEEPCSR_KSO_MASK)) {
		val |= (SBSDIO_FUNC1_SLEEPCSR_KSO_EN <<
			SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT);
3487 3488
		brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
				  val, &err);
3489 3490 3491 3492 3493 3494 3495 3496 3497 3498
		if (err) {
			brcmf_err("error writing SBSDIO_FUNC1_SLEEPCSR\n");
			return err;
		}
	}

	return 0;
}


3499
static int brcmf_sdio_bus_preinit(struct device *dev)
3500 3501 3502 3503
{
	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
	struct brcmf_sdio *bus = sdiodev->bus;
3504
	uint pad_size;
3505 3506 3507 3508
	u32 value;
	u8 idx;
	int err;

3509 3510 3511 3512
	/* the commands below use the terms tx and rx from
	 * a device perspective, ie. bus:txglom affects the
	 * bus transfers from device to host.
	 */
3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528
	idx = brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_SDIO_DEV);
	if (bus->ci->c_inf[idx].rev < 12) {
		/* for sdio core rev < 12, disable txgloming */
		value = 0;
		err = brcmf_iovar_data_set(dev, "bus:txglom", &value,
					   sizeof(u32));
	} else {
		/* otherwise, set txglomalign */
		value = 4;
		if (sdiodev->pdata)
			value = sdiodev->pdata->sd_sgentry_align;
		/* SDIO ADMA requires at least 32 bit alignment */
		value = max_t(u32, value, 4);
		err = brcmf_iovar_data_set(dev, "bus:txglomalign", &value,
					   sizeof(u32));
	}
3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554

	if (err < 0)
		goto done;

	bus->tx_hdrlen = SDPCM_HWHDR_LEN + SDPCM_SWHDR_LEN;
	if (sdiodev->sg_support) {
		bus->txglom = false;
		value = 1;
		pad_size = bus->sdiodev->func[2]->cur_blksize << 1;
		bus->txglom_sgpad = brcmu_pkt_buf_get_skb(pad_size);
		if (!bus->txglom_sgpad)
			brcmf_err("allocating txglom padding skb failed, reduced performance\n");

		err = brcmf_iovar_data_set(bus->sdiodev->dev, "bus:rxglom",
					   &value, sizeof(u32));
		if (err < 0) {
			/* bus:rxglom is allowed to fail */
			err = 0;
		} else {
			bus->txglom = true;
			bus->tx_hdrlen += SDPCM_HWEXT_LEN;
		}
	}
	brcmf_bus_add_txhdrlen(bus->sdiodev->dev, bus->tx_hdrlen);

done:
3555 3556 3557
	return err;
}

3558
static int brcmf_sdio_bus_init(struct device *dev)
3559
{
3560
	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
3561
	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
3562
	struct brcmf_sdio *bus = sdiodev->bus;
3563 3564 3565 3566 3567 3568
	int err, ret = 0;
	u8 saveclk;

	brcmf_dbg(TRACE, "Enter\n");

	/* try to download image and nvram to the dongle */
3569
	if (bus_if->state == BRCMF_BUS_DOWN) {
3570 3571 3572
		err = brcmf_sdio_download_firmware(bus);
		if (err)
			return err;
3573 3574
	}

3575
	if (!bus->sdiodev->bus_if->drvr)
3576 3577 3578
		return 0;

	/* Start the watchdog timer */
3579
	bus->sdcnt.tickcnt = 0;
3580
	brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
3581

3582
	sdio_claim_host(bus->sdiodev->func[1]);
3583 3584

	/* Make sure backplane clock is on, needed to generate F2 interrupt */
3585
	brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
3586 3587 3588 3589
	if (bus->clkstate != CLK_AVAIL)
		goto exit;

	/* Force clocks on backplane to be sure F2 interrupt propagates */
3590 3591
	saveclk = brcmf_sdiod_regrb(bus->sdiodev,
				    SBSDIO_FUNC1_CHIPCLKCSR, &err);
3592
	if (!err) {
3593 3594
		brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
				  (saveclk | SBSDIO_FORCE_HT), &err);
3595 3596
	}
	if (err) {
3597
		brcmf_err("Failed to force clock for F2: err %d\n", err);
3598 3599 3600 3601 3602
		goto exit;
	}

	/* Enable function 2 (frame transfers) */
	w_sdreg32(bus, SDPCM_PROT_VERSION << SMB_DATA_VERSION_SHIFT,
3603
		  offsetof(struct sdpcmd_regs, tosbmailboxdata));
3604
	err = sdio_enable_func(bus->sdiodev->func[SDIO_FUNC_2]);
3605 3606


3607
	brcmf_dbg(INFO, "enable F2: err=%d\n", err);
3608 3609

	/* If F2 successfully enabled, set core and enable interrupts */
3610
	if (!err) {
3611 3612 3613
		/* Set up the interrupt mask and enable interrupts */
		bus->hostintmask = HOSTINTMASK;
		w_sdreg32(bus, bus->hostintmask,
3614
			  offsetof(struct sdpcmd_regs, hostintmask));
3615

3616
		brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_WATERMARK, 8, &err);
3617
	} else {
3618
		/* Disable F2 again */
3619
		sdio_disable_func(bus->sdiodev->func[SDIO_FUNC_2]);
3620
		ret = -ENODEV;
3621 3622
	}

3623 3624
	if (brcmf_sdio_sr_capable(bus)) {
		brcmf_sdio_sr_init(bus);
3625 3626
	} else {
		/* Restore previous clock setting */
3627 3628
		brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
				  saveclk, &err);
3629
	}
3630

3631
	if (ret == 0) {
3632
		ret = brcmf_sdiod_intr_register(bus->sdiodev);
3633
		if (ret != 0)
3634
			brcmf_err("intr register failed:%d\n", ret);
3635 3636
	}

3637
	/* If we didn't come up, turn off backplane clock */
3638
	if (ret != 0)
3639
		brcmf_sdio_clkctl(bus, CLK_NONE, false);
3640 3641

exit:
3642
	sdio_release_host(bus->sdiodev->func[1]);
3643 3644 3645 3646

	return ret;
}

3647
void brcmf_sdio_isr(struct brcmf_sdio *bus)
3648 3649 3650 3651
{
	brcmf_dbg(TRACE, "Enter\n");

	if (!bus) {
3652
		brcmf_err("bus is null pointer, exiting\n");
3653 3654 3655
		return;
	}

3656
	if (bus->sdiodev->bus_if->state == BRCMF_BUS_DOWN) {
3657
		brcmf_err("bus is down. we have nothing to do\n");
3658 3659 3660
		return;
	}
	/* Count the interrupt call */
3661
	bus->sdcnt.intrcount++;
3662 3663 3664 3665
	if (in_interrupt())
		atomic_set(&bus->ipend, 1);
	else
		if (brcmf_sdio_intr_rstatus(bus)) {
3666
			brcmf_err("failed backplane access\n");
3667 3668
			bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
		}
3669 3670 3671

	/* Disable additional interrupts (is this needed now)? */
	if (!bus->intr)
3672
		brcmf_err("isr w/o interrupt configured!\n");
3673

3674
	atomic_inc(&bus->dpc_tskcnt);
3675
	queue_work(bus->brcmf_wq, &bus->datawork);
3676 3677
}

3678
static bool brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
3679
{
J
Joe Perches 已提交
3680
#ifdef DEBUG
3681
	struct brcmf_bus *bus_if = dev_get_drvdata(bus->sdiodev->dev);
J
Joe Perches 已提交
3682
#endif	/* DEBUG */
3683 3684 3685 3686

	brcmf_dbg(TIMER, "Enter\n");

	/* Poll period: check device if appropriate. */
3687 3688
	if (!bus->sr_enabled &&
	    bus->poll && (++bus->polltick >= bus->pollrate)) {
3689 3690 3691 3692 3693 3694
		u32 intstatus = 0;

		/* Reset poll tick */
		bus->polltick = 0;

		/* Check device if no interrupts */
3695 3696
		if (!bus->intr ||
		    (bus->sdcnt.intrcount == bus->sdcnt.lastintrs)) {
3697

3698
			if (atomic_read(&bus->dpc_tskcnt) == 0) {
3699
				u8 devpend;
3700

3701
				sdio_claim_host(bus->sdiodev->func[1]);
3702 3703 3704
				devpend = brcmf_sdiod_regrb(bus->sdiodev,
							    SDIO_CCCR_INTx,
							    NULL);
3705
				sdio_release_host(bus->sdiodev->func[1]);
3706 3707 3708 3709 3710 3711 3712 3713
				intstatus =
				    devpend & (INTR_STATUS_FUNC1 |
					       INTR_STATUS_FUNC2);
			}

			/* If there is something, make like the ISR and
				 schedule the DPC */
			if (intstatus) {
3714
				bus->sdcnt.pollcnt++;
3715
				atomic_set(&bus->ipend, 1);
3716

3717
				atomic_inc(&bus->dpc_tskcnt);
3718
				queue_work(bus->brcmf_wq, &bus->datawork);
3719 3720 3721 3722
			}
		}

		/* Update interrupt tracking */
3723
		bus->sdcnt.lastintrs = bus->sdcnt.intrcount;
3724
	}
J
Joe Perches 已提交
3725
#ifdef DEBUG
3726
	/* Poll for console output periodically */
H
Hante Meuleman 已提交
3727
	if (bus_if && bus_if->state == BRCMF_BUS_DATA &&
3728
	    bus->console_interval != 0) {
3729 3730 3731
		bus->console.count += BRCMF_WD_POLL_MS;
		if (bus->console.count >= bus->console_interval) {
			bus->console.count -= bus->console_interval;
3732
			sdio_claim_host(bus->sdiodev->func[1]);
3733
			/* Make sure backplane clock is on */
3734 3735
			brcmf_sdio_bus_sleep(bus, false, false);
			if (brcmf_sdio_readconsole(bus) < 0)
3736 3737
				/* stop on error */
				bus->console_interval = 0;
3738
			sdio_release_host(bus->sdiodev->func[1]);
3739 3740
		}
	}
J
Joe Perches 已提交
3741
#endif				/* DEBUG */
3742 3743 3744 3745 3746 3747 3748

	/* On idle timeout clear activity flag and/or turn off clock */
	if ((bus->idletime > 0) && (bus->clkstate == CLK_AVAIL)) {
		if (++bus->idlecount >= bus->idletime) {
			bus->idlecount = 0;
			if (bus->activity) {
				bus->activity = false;
3749
				brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
3750
			} else {
3751
				brcmf_dbg(SDIO, "idle\n");
3752
				sdio_claim_host(bus->sdiodev->func[1]);
3753
				brcmf_sdio_bus_sleep(bus, true, false);
3754
				sdio_release_host(bus->sdiodev->func[1]);
3755 3756 3757 3758
			}
		}
	}

3759
	return (atomic_read(&bus->ipend) > 0);
3760 3761
}

3762 3763 3764 3765 3766
static void brcmf_sdio_dataworker(struct work_struct *work)
{
	struct brcmf_sdio *bus = container_of(work, struct brcmf_sdio,
					      datawork);

3767
	while (atomic_read(&bus->dpc_tskcnt)) {
3768
		brcmf_sdio_dpc(bus);
3769
		atomic_dec(&bus->dpc_tskcnt);
3770 3771 3772
	}
}

3773
static bool
3774
brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
3775 3776 3777 3778 3779
{
	u8 clkctl = 0;
	int err = 0;
	int reg_addr;
	u32 reg_val;
3780
	u32 drivestrength;
3781 3782 3783

	bus->alp_only = true;

3784 3785
	sdio_claim_host(bus->sdiodev->func[1]);

3786
	pr_debug("F1 signature read @0x18000000=0x%4x\n",
3787
		 brcmf_sdiod_regrl(bus->sdiodev, SI_ENUM_BASE, NULL));
3788 3789

	/*
3790
	 * Force PLL off until brcmf_sdio_chip_attach()
3791 3792 3793
	 * programs PLL control regs
	 */

3794 3795
	brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
			  BRCMF_INIT_CLKCTL1, &err);
3796
	if (!err)
3797 3798
		clkctl = brcmf_sdiod_regrb(bus->sdiodev,
					   SBSDIO_FUNC1_CHIPCLKCSR, &err);
3799 3800

	if (err || ((clkctl & ~SBSDIO_AVBITS) != BRCMF_INIT_CLKCTL1)) {
3801
		brcmf_err("ChipClkCSR access: err %d wrote 0x%02x read 0x%02x\n",
3802 3803 3804 3805
			  err, BRCMF_INIT_CLKCTL1, clkctl);
		goto fail;
	}

3806
	if (brcmf_sdio_chip_attach(bus->sdiodev, &bus->ci)) {
3807
		brcmf_err("brcmf_sdio_chip_attach failed!\n");
3808 3809 3810
		goto fail;
	}

3811
	if (brcmf_sdio_kso_init(bus)) {
3812 3813 3814 3815
		brcmf_err("error enabling KSO\n");
		goto fail;
	}

3816 3817 3818 3819 3820
	if ((bus->sdiodev->pdata) && (bus->sdiodev->pdata->drive_strength))
		drivestrength = bus->sdiodev->pdata->drive_strength;
	else
		drivestrength = DEFAULT_SDIO_DRIVE_STRENGTH;
	brcmf_sdio_chip_drivestrengthinit(bus->sdiodev, bus->ci, drivestrength);
3821

3822
	/* Get info on the SOCRAM cores... */
3823 3824
	bus->ramsize = bus->ci->ramsize;
	if (!(bus->ramsize)) {
3825
		brcmf_err("failed to find SOCRAM memory!\n");
3826 3827 3828
		goto fail;
	}

3829
	/* Set card control so an SDIO card reset does a WLAN backplane reset */
3830 3831
	reg_val = brcmf_sdiod_regrb(bus->sdiodev,
				    SDIO_CCCR_BRCM_CARDCTRL, &err);
3832 3833 3834 3835 3836
	if (err)
		goto fail;

	reg_val |= SDIO_CCCR_BRCM_CARDCTRL_WLANRESET;

3837 3838
	brcmf_sdiod_regwb(bus->sdiodev,
			  SDIO_CCCR_BRCM_CARDCTRL, reg_val, &err);
3839 3840 3841 3842 3843 3844
	if (err)
		goto fail;

	/* set PMUControl so a backplane reset does PMU state reload */
	reg_addr = CORE_CC_REG(bus->ci->c_inf[0].base,
			       pmucontrol);
3845 3846 3847
	reg_val = brcmf_sdiod_regrl(bus->sdiodev,
				    reg_addr,
				    &err);
3848 3849 3850 3851 3852
	if (err)
		goto fail;

	reg_val |= (BCMA_CC_PMU_CTL_RES_RELOAD << BCMA_CC_PMU_CTL_RES_SHIFT);

3853 3854 3855 3856
	brcmf_sdiod_regwl(bus->sdiodev,
			  reg_addr,
			  reg_val,
			  &err);
3857 3858 3859
	if (err)
		goto fail;

3860

3861 3862
	sdio_release_host(bus->sdiodev->func[1]);

3863 3864
	brcmu_pktq_init(&bus->txq, (PRIOMASK + 1), TXQLEN);

3865 3866 3867 3868
	/* allocate header buffer */
	bus->hdrbuf = kzalloc(MAX_HDR_READ + bus->head_align, GFP_KERNEL);
	if (!bus->hdrbuf)
		return false;
3869 3870
	/* Locate an appropriately-aligned portion of hdrbuf */
	bus->rxhdr = (u8 *) roundup((unsigned long)&bus->hdrbuf[0],
3871
				    bus->head_align);
3872 3873 3874 3875 3876 3877 3878 3879 3880 3881

	/* Set the poll and/or interrupt flags */
	bus->intr = true;
	bus->poll = false;
	if (bus->poll)
		bus->pollrate = 1;

	return true;

fail:
3882
	sdio_release_host(bus->sdiodev->func[1]);
3883 3884 3885 3886
	return false;
}

static int
3887
brcmf_sdio_watchdog_thread(void *data)
3888
{
3889
	struct brcmf_sdio *bus = (struct brcmf_sdio *)data;
3890 3891 3892 3893 3894 3895 3896

	allow_signal(SIGTERM);
	/* Run until signal received */
	while (1) {
		if (kthread_should_stop())
			break;
		if (!wait_for_completion_interruptible(&bus->watchdog_wait)) {
3897
			brcmf_sdio_bus_watchdog(bus);
3898
			/* Count the tick for reference */
3899
			bus->sdcnt.tickcnt++;
3900 3901 3902 3903 3904 3905 3906
		} else
			break;
	}
	return 0;
}

static void
3907
brcmf_sdio_watchdog(unsigned long data)
3908
{
3909
	struct brcmf_sdio *bus = (struct brcmf_sdio *)data;
3910 3911 3912 3913 3914 3915 3916 3917 3918 3919

	if (bus->watchdog_tsk) {
		complete(&bus->watchdog_wait);
		/* Reschedule the watchdog */
		if (bus->wd_timer_valid)
			mod_timer(&bus->timer,
				  jiffies + BRCMF_WD_POLL_MS * HZ / 1000);
	}
}

A
Arend van Spriel 已提交
3920
static struct brcmf_bus_ops brcmf_sdio_bus_ops = {
3921 3922 3923 3924 3925 3926 3927
	.stop = brcmf_sdio_bus_stop,
	.preinit = brcmf_sdio_bus_preinit,
	.init = brcmf_sdio_bus_init,
	.txdata = brcmf_sdio_bus_txdata,
	.txctl = brcmf_sdio_bus_txctl,
	.rxctl = brcmf_sdio_bus_rxctl,
	.gettxq = brcmf_sdio_bus_gettxq,
A
Arend van Spriel 已提交
3928 3929
};

3930
struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
3931 3932
{
	int ret;
3933
	struct brcmf_sdio *bus;
3934 3935 3936 3937

	brcmf_dbg(TRACE, "Enter\n");

	/* Allocate private bus interface state */
3938
	bus = kzalloc(sizeof(struct brcmf_sdio), GFP_ATOMIC);
3939 3940 3941 3942 3943
	if (!bus)
		goto fail;

	bus->sdiodev = sdiodev;
	sdiodev->bus = bus;
3944
	skb_queue_head_init(&bus->glom);
3945 3946 3947
	bus->txbound = BRCMF_TXBOUND;
	bus->rxbound = BRCMF_RXBOUND;
	bus->txminmax = BRCMF_TXMINMAX;
3948
	bus->tx_seq = SDPCM_SEQ_WRAP - 1;
3949

3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961
	/* platform specific configuration:
	 *   alignments must be at least 4 bytes for ADMA
         */
	bus->head_align = ALIGNMENT;
	bus->sgentry_align = ALIGNMENT;
	if (sdiodev->pdata) {
		if (sdiodev->pdata->sd_head_align > ALIGNMENT)
			bus->head_align = sdiodev->pdata->sd_head_align;
		if (sdiodev->pdata->sd_sgentry_align > ALIGNMENT)
			bus->sgentry_align = sdiodev->pdata->sd_sgentry_align;
	}

3962 3963 3964
	INIT_WORK(&bus->datawork, brcmf_sdio_dataworker);
	bus->brcmf_wq = create_singlethread_workqueue("brcmf_wq");
	if (bus->brcmf_wq == NULL) {
3965
		brcmf_err("insufficient memory to create txworkqueue\n");
3966 3967 3968
		goto fail;
	}

3969
	/* attempt to attach to the dongle */
3970 3971
	if (!(brcmf_sdio_probe_attach(bus))) {
		brcmf_err("brcmf_sdio_probe_attach failed\n");
3972 3973 3974
		goto fail;
	}

3975
	spin_lock_init(&bus->rxctl_lock);
3976 3977 3978 3979 3980 3981 3982
	spin_lock_init(&bus->txqlock);
	init_waitqueue_head(&bus->ctrl_wait);
	init_waitqueue_head(&bus->dcmd_resp_wait);

	/* Set up the watchdog timer */
	init_timer(&bus->timer);
	bus->timer.data = (unsigned long)bus;
3983
	bus->timer.function = brcmf_sdio_watchdog;
3984 3985 3986

	/* Initialize watchdog thread */
	init_completion(&bus->watchdog_wait);
3987
	bus->watchdog_tsk = kthread_run(brcmf_sdio_watchdog_thread,
3988 3989
					bus, "brcmf_watchdog");
	if (IS_ERR(bus->watchdog_tsk)) {
3990
		pr_warn("brcmf_watchdog thread failed to start\n");
3991 3992 3993
		bus->watchdog_tsk = NULL;
	}
	/* Initialize DPC thread */
3994
	atomic_set(&bus->dpc_tskcnt, 0);
3995

3996
	/* Assign bus interface call back */
A
Arend van Spriel 已提交
3997 3998
	bus->sdiodev->bus_if->dev = bus->sdiodev->dev;
	bus->sdiodev->bus_if->ops = &brcmf_sdio_bus_ops;
3999 4000
	bus->sdiodev->bus_if->chip = bus->ci->chip;
	bus->sdiodev->bus_if->chiprev = bus->ci->chiprev;
A
Arend van Spriel 已提交
4001

4002 4003 4004 4005
	/* default sdio bus header length for tx packet */
	bus->tx_hdrlen = SDPCM_HWHDR_LEN + SDPCM_SWHDR_LEN;

	/* Attach to the common layer, reserve hdr space */
4006
	ret = brcmf_attach(bus->sdiodev->dev);
4007
	if (ret != 0) {
4008
		brcmf_err("brcmf_attach failed\n");
4009 4010 4011 4012
		goto fail;
	}

	/* Allocate buffers */
4013 4014 4015 4016 4017 4018 4019 4020 4021
	if (bus->sdiodev->bus_if->maxctl) {
		bus->rxblen =
		    roundup((bus->sdiodev->bus_if->maxctl + SDPCM_HDRLEN),
			    ALIGNMENT) + bus->head_align;
		bus->rxbuf = kmalloc(bus->rxblen, GFP_ATOMIC);
		if (!(bus->rxbuf)) {
			brcmf_err("rxbuf allocation failed\n");
			goto fail;
		}
4022 4023
	}

4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048
	sdio_claim_host(bus->sdiodev->func[1]);

	/* Disable F2 to clear any intermediate frame state on the dongle */
	sdio_disable_func(bus->sdiodev->func[SDIO_FUNC_2]);

	bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
	bus->rxflow = false;

	/* Done with backplane-dependent accesses, can drop clock... */
	brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, 0, NULL);

	sdio_release_host(bus->sdiodev->func[1]);

	/* ...and initialize clock/power states */
	bus->clkstate = CLK_SDONLY;
	bus->idletime = BRCMF_IDLE_INTERVAL;
	bus->idleclock = BRCMF_IDLE_ACTIVE;

	/* Query the F2 block size, set roundup accordingly */
	bus->blocksize = bus->sdiodev->func[2]->cur_blksize;
	bus->roundup = min(max_roundup, bus->blocksize);

	/* SR state */
	bus->sleeping = false;
	bus->sr_enabled = false;
4049

4050
	brcmf_sdio_debugfs_create(bus);
4051 4052 4053
	brcmf_dbg(INFO, "completed!!\n");

	/* if firmware path present try to download and bring up bus */
4054
	ret = brcmf_bus_start(bus->sdiodev->dev);
4055
	if (ret != 0) {
4056
		brcmf_err("dongle is not responding\n");
4057
		goto fail;
4058
	}
4059

4060 4061 4062
	return bus;

fail:
4063
	brcmf_sdio_remove(bus);
4064 4065 4066
	return NULL;
}

4067 4068
/* Detach and free everything */
void brcmf_sdio_remove(struct brcmf_sdio *bus)
4069 4070 4071
{
	brcmf_dbg(TRACE, "Enter\n");

4072 4073 4074 4075 4076 4077 4078 4079 4080 4081
	if (bus) {
		/* De-register interrupt handler */
		brcmf_sdiod_intr_unregister(bus->sdiodev);

		cancel_work_sync(&bus->datawork);
		if (bus->brcmf_wq)
			destroy_workqueue(bus->brcmf_wq);

		if (bus->sdiodev->bus_if->drvr) {
			brcmf_detach(bus->sdiodev->dev);
4082 4083 4084 4085 4086 4087 4088 4089
		}

		if (bus->ci) {
			sdio_claim_host(bus->sdiodev->func[1]);
			brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
			brcmf_sdio_clkctl(bus, CLK_NONE, false);
			sdio_release_host(bus->sdiodev->func[1]);
			brcmf_sdio_chip_detach(&bus->ci);
4090 4091 4092
		}

		brcmu_pkt_buf_free_skb(bus->txglom_sgpad);
4093
		kfree(bus->rxbuf);
4094
		kfree(bus->hdrbuf);
4095
		kfree(bus->vars);
4096 4097
		kfree(bus);
	}
4098 4099 4100 4101

	brcmf_dbg(TRACE, "Disconnected\n");
}

4102
void brcmf_sdio_wd_timer(struct brcmf_sdio *bus, uint wdtick)
4103 4104
{
	/* Totally stop the timer */
4105
	if (!wdtick && bus->wd_timer_valid) {
4106 4107 4108 4109 4110 4111
		del_timer_sync(&bus->timer);
		bus->wd_timer_valid = false;
		bus->save_ms = wdtick;
		return;
	}

4112
	/* don't start the wd until fw is loaded */
4113
	if (bus->sdiodev->bus_if->state != BRCMF_BUS_DATA)
4114 4115
		return;

4116 4117
	if (wdtick) {
		if (bus->save_ms != BRCMF_WD_POLL_MS) {
4118
			if (bus->wd_timer_valid)
4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138
				/* Stop timer and restart at new value */
				del_timer_sync(&bus->timer);

			/* Create timer again when watchdog period is
			   dynamically changed or in the first instance
			 */
			bus->timer.expires =
				jiffies + BRCMF_WD_POLL_MS * HZ / 1000;
			add_timer(&bus->timer);

		} else {
			/* Re arm the timer, at last watchdog period */
			mod_timer(&bus->timer,
				jiffies + BRCMF_WD_POLL_MS * HZ / 1000);
		}

		bus->wd_timer_valid = true;
		bus->save_ms = wdtick;
	}
}