cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

if_cs.c (24669B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3
      4  Driver for the Marvell 8385 based compact flash WLAN cards.
      5
      6  (C) 2007 by Holger Schurig <hs4233@mail.mn-solutions.de>
      7
      8
      9*/
     10
     11#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
     12
     13#include <linux/module.h>
     14#include <linux/slab.h>
     15#include <linux/delay.h>
     16#include <linux/moduleparam.h>
     17#include <linux/firmware.h>
     18#include <linux/netdevice.h>
     19
     20#include <pcmcia/cistpl.h>
     21#include <pcmcia/ds.h>
     22
     23#include <linux/io.h>
     24
     25#define DRV_NAME "libertas_cs"
     26
     27#include "decl.h"
     28#include "defs.h"
     29#include "dev.h"
     30
     31
     32/********************************************************************/
     33/* Module stuff                                                     */
     34/********************************************************************/
     35
     36MODULE_AUTHOR("Holger Schurig <hs4233@mail.mn-solutions.de>");
     37MODULE_DESCRIPTION("Driver for Marvell 83xx compact flash WLAN cards");
     38MODULE_LICENSE("GPL");
     39
     40
     41
     42/********************************************************************/
     43/* Data structures                                                  */
     44/********************************************************************/
     45
     46struct if_cs_card {
     47	struct pcmcia_device *p_dev;
     48	struct lbs_private *priv;
     49	void __iomem *iobase;
     50	bool align_regs;
     51	u32 model;
     52};
     53
     54
     55enum {
     56	MODEL_UNKNOWN = 0x00,
     57	MODEL_8305 = 0x01,
     58	MODEL_8381 = 0x02,
     59	MODEL_8385 = 0x03
     60};
     61
     62static const struct lbs_fw_table fw_table[] = {
     63	{ MODEL_8305, "libertas/cf8305.bin", NULL },
     64	{ MODEL_8305, "libertas_cs_helper.fw", NULL },
     65	{ MODEL_8381, "libertas/cf8381_helper.bin", "libertas/cf8381.bin" },
     66	{ MODEL_8381, "libertas_cs_helper.fw", "libertas_cs.fw" },
     67	{ MODEL_8385, "libertas/cf8385_helper.bin", "libertas/cf8385.bin" },
     68	{ MODEL_8385, "libertas_cs_helper.fw", "libertas_cs.fw" },
     69	{ 0, NULL, NULL }
     70};
     71MODULE_FIRMWARE("libertas/cf8305.bin");
     72MODULE_FIRMWARE("libertas/cf8381_helper.bin");
     73MODULE_FIRMWARE("libertas/cf8381.bin");
     74MODULE_FIRMWARE("libertas/cf8385_helper.bin");
     75MODULE_FIRMWARE("libertas/cf8385.bin");
     76MODULE_FIRMWARE("libertas_cs_helper.fw");
     77MODULE_FIRMWARE("libertas_cs.fw");
     78
     79
     80/********************************************************************/
     81/* Hardware access                                                  */
     82/********************************************************************/
     83
     84/* This define enables wrapper functions which allow you
     85   to dump all register accesses. You normally won't this,
     86   except for development */
     87/* #define DEBUG_IO */
     88
     89#ifdef DEBUG_IO
     90static int debug_output = 0;
     91#else
     92/* This way the compiler optimizes the printk's away */
     93#define debug_output 0
     94#endif
     95
     96static inline unsigned int if_cs_read8(struct if_cs_card *card, uint reg)
     97{
     98	unsigned int val = ioread8(card->iobase + reg);
     99	if (debug_output)
    100		printk(KERN_INFO "inb %08x<%02x\n", reg, val);
    101	return val;
    102}
    103static inline unsigned int if_cs_read16(struct if_cs_card *card, uint reg)
    104{
    105	unsigned int val = ioread16(card->iobase + reg);
    106	if (debug_output)
    107		printk(KERN_INFO "inw %08x<%04x\n", reg, val);
    108	return val;
    109}
    110static inline void if_cs_read16_rep(
    111	struct if_cs_card *card,
    112	uint reg,
    113	void *buf,
    114	unsigned long count)
    115{
    116	if (debug_output)
    117		printk(KERN_INFO "insw %08x<(0x%lx words)\n",
    118			reg, count);
    119	ioread16_rep(card->iobase + reg, buf, count);
    120}
    121
    122static inline void if_cs_write8(struct if_cs_card *card, uint reg, u8 val)
    123{
    124	if (debug_output)
    125		printk(KERN_INFO "outb %08x>%02x\n", reg, val);
    126	iowrite8(val, card->iobase + reg);
    127}
    128
    129static inline void if_cs_write16(struct if_cs_card *card, uint reg, u16 val)
    130{
    131	if (debug_output)
    132		printk(KERN_INFO "outw %08x>%04x\n", reg, val);
    133	iowrite16(val, card->iobase + reg);
    134}
    135
    136static inline void if_cs_write16_rep(
    137	struct if_cs_card *card,
    138	uint reg,
    139	const void *buf,
    140	unsigned long count)
    141{
    142	if (debug_output)
    143		printk(KERN_INFO "outsw %08x>(0x%lx words)\n",
    144			reg, count);
    145	iowrite16_rep(card->iobase + reg, buf, count);
    146}
    147
    148
    149/*
    150 * I know that polling/delaying is frowned upon. However, this procedure
    151 * with polling is needed while downloading the firmware. At this stage,
    152 * the hardware does unfortunately not create any interrupts.
    153 *
    154 * Fortunately, this function is never used once the firmware is in
    155 * the card. :-)
    156 *
    157 * As a reference, see the "Firmware Specification v5.1", page 18
    158 * and 19. I did not follow their suggested timing to the word,
    159 * but this works nice & fast anyway.
    160 */
    161static int if_cs_poll_while_fw_download(struct if_cs_card *card, uint addr, u8 reg)
    162{
    163	int i;
    164
    165	for (i = 0; i < 100000; i++) {
    166		u8 val = if_cs_read8(card, addr);
    167		if (val == reg)
    168			return 0;
    169		udelay(5);
    170	}
    171	return -ETIME;
    172}
    173
    174
    175
    176/*
    177 * First the bitmasks for the host/card interrupt/status registers:
    178 */
    179#define IF_CS_BIT_TX			0x0001
    180#define IF_CS_BIT_RX			0x0002
    181#define IF_CS_BIT_COMMAND		0x0004
    182#define IF_CS_BIT_RESP			0x0008
    183#define IF_CS_BIT_EVENT			0x0010
    184#define	IF_CS_BIT_MASK			0x001f
    185
    186
    187
    188/*
    189 * It's not really clear to me what the host status register is for. It
    190 * needs to be set almost in union with "host int cause". The following
    191 * bits from above are used:
    192 *
    193 *   IF_CS_BIT_TX         driver downloaded a data packet
    194 *   IF_CS_BIT_RX         driver got a data packet
    195 *   IF_CS_BIT_COMMAND    driver downloaded a command
    196 *   IF_CS_BIT_RESP       not used (has some meaning with powerdown)
    197 *   IF_CS_BIT_EVENT      driver read a host event
    198 */
    199#define IF_CS_HOST_STATUS		0x00000000
    200
    201/*
    202 * With the host int cause register can the host (that is, Linux) cause
    203 * an interrupt in the firmware, to tell the firmware about those events:
    204 *
    205 *   IF_CS_BIT_TX         a data packet has been downloaded
    206 *   IF_CS_BIT_RX         a received data packet has retrieved
    207 *   IF_CS_BIT_COMMAND    a firmware block or a command has been downloaded
    208 *   IF_CS_BIT_RESP       not used (has some meaning with powerdown)
    209 *   IF_CS_BIT_EVENT      a host event (link lost etc) has been retrieved
    210 */
    211#define IF_CS_HOST_INT_CAUSE		0x00000002
    212
    213/*
    214 * The host int mask register is used to enable/disable interrupt.  However,
    215 * I have the suspicion that disabled interrupts are lost.
    216 */
    217#define IF_CS_HOST_INT_MASK		0x00000004
    218
    219/*
    220 * Used to send or receive data packets:
    221 */
    222#define IF_CS_WRITE			0x00000016
    223#define IF_CS_WRITE_LEN			0x00000014
    224#define IF_CS_READ			0x00000010
    225#define IF_CS_READ_LEN			0x00000024
    226
    227/*
    228 * Used to send commands (and to send firmware block) and to
    229 * receive command responses:
    230 */
    231#define IF_CS_CMD			0x0000001A
    232#define IF_CS_CMD_LEN			0x00000018
    233#define IF_CS_RESP			0x00000012
    234#define IF_CS_RESP_LEN			0x00000030
    235
    236/*
    237 * The card status registers shows what the card/firmware actually
    238 * accepts:
    239 *
    240 *   IF_CS_BIT_TX        you may send a data packet
    241 *   IF_CS_BIT_RX        you may retrieve a data packet
    242 *   IF_CS_BIT_COMMAND   you may send a command
    243 *   IF_CS_BIT_RESP      you may retrieve a command response
    244 *   IF_CS_BIT_EVENT     the card has a event for use (link lost, snr low etc)
    245 *
    246 * When reading this register several times, you will get back the same
    247 * results --- with one exception: the IF_CS_BIT_EVENT clear itself
    248 * automatically.
    249 *
    250 * Not that we don't rely on BIT_RX,_BIT_RESP or BIT_EVENT because
    251 * we handle this via the card int cause register.
    252 */
    253#define IF_CS_CARD_STATUS		0x00000020
    254#define IF_CS_CARD_STATUS_MASK		0x7f00
    255
    256/*
    257 * The card int cause register is used by the card/firmware to notify us
    258 * about the following events:
    259 *
    260 *   IF_CS_BIT_TX        a data packet has successfully been sentx
    261 *   IF_CS_BIT_RX        a data packet has been received and can be retrieved
    262 *   IF_CS_BIT_COMMAND   not used
    263 *   IF_CS_BIT_RESP      the firmware has a command response for us
    264 *   IF_CS_BIT_EVENT     the card has a event for use (link lost, snr low etc)
    265 */
    266#define IF_CS_CARD_INT_CAUSE		0x00000022
    267
    268/*
    269 * This is used to for handshaking with the card's bootloader/helper image
    270 * to synchronize downloading of firmware blocks.
    271 */
    272#define IF_CS_SQ_READ_LOW		0x00000028
    273#define IF_CS_SQ_HELPER_OK		0x10
    274
    275/*
    276 * The scratch register tells us ...
    277 *
    278 * IF_CS_SCRATCH_BOOT_OK     the bootloader runs
    279 * IF_CS_SCRATCH_HELPER_OK   the helper firmware already runs
    280 */
    281#define IF_CS_SCRATCH			0x0000003F
    282#define IF_CS_SCRATCH_BOOT_OK		0x00
    283#define IF_CS_SCRATCH_HELPER_OK		0x5a
    284
    285/*
    286 * Used to detect ancient chips:
    287 */
    288#define IF_CS_PRODUCT_ID		0x0000001C
    289#define IF_CS_CF8385_B1_REV		0x12
    290#define IF_CS_CF8381_B3_REV		0x04
    291#define IF_CS_CF8305_B1_REV		0x03
    292
    293/*
    294 * Used to detect other cards than CF8385 since their revisions of silicon
    295 * doesn't match those from CF8385, eg. CF8381 B3 works with this driver.
    296 */
    297#define CF8305_MANFID		0x02db
    298#define CF8305_CARDID		0x8103
    299#define CF8381_MANFID		0x02db
    300#define CF8381_CARDID		0x6064
    301#define CF8385_MANFID		0x02df
    302#define CF8385_CARDID		0x8103
    303
    304/*
    305 * FIXME: just use the 'driver_info' field of 'struct pcmcia_device_id' when
    306 * that gets fixed.  Currently there's no way to access it from the probe hook.
    307 */
    308static inline u32 get_model(u16 manf_id, u16 card_id)
    309{
    310	/* NOTE: keep in sync with if_cs_ids */
    311	if (manf_id == CF8305_MANFID && card_id == CF8305_CARDID)
    312		return MODEL_8305;
    313	else if (manf_id == CF8381_MANFID && card_id == CF8381_CARDID)
    314		return MODEL_8381;
    315	else if (manf_id == CF8385_MANFID && card_id == CF8385_CARDID)
    316		return MODEL_8385;
    317	return MODEL_UNKNOWN;
    318}
    319
    320/********************************************************************/
    321/* I/O and interrupt handling                                       */
    322/********************************************************************/
    323
    324static inline void if_cs_enable_ints(struct if_cs_card *card)
    325{
    326	if_cs_write16(card, IF_CS_HOST_INT_MASK, 0);
    327}
    328
    329static inline void if_cs_disable_ints(struct if_cs_card *card)
    330{
    331	if_cs_write16(card, IF_CS_HOST_INT_MASK, IF_CS_BIT_MASK);
    332}
    333
    334/*
    335 * Called from if_cs_host_to_card to send a command to the hardware
    336 */
    337static int if_cs_send_cmd(struct lbs_private *priv, u8 *buf, u16 nb)
    338{
    339	struct if_cs_card *card = (struct if_cs_card *)priv->card;
    340	int ret = -1;
    341	int loops = 0;
    342
    343	if_cs_disable_ints(card);
    344
    345	/* Is hardware ready? */
    346	while (1) {
    347		u16 status = if_cs_read16(card, IF_CS_CARD_STATUS);
    348		if (status & IF_CS_BIT_COMMAND)
    349			break;
    350		if (++loops > 100) {
    351			netdev_err(priv->dev, "card not ready for commands\n");
    352			goto done;
    353		}
    354		mdelay(1);
    355	}
    356
    357	if_cs_write16(card, IF_CS_CMD_LEN, nb);
    358
    359	if_cs_write16_rep(card, IF_CS_CMD, buf, nb / 2);
    360	/* Are we supposed to transfer an odd amount of bytes? */
    361	if (nb & 1)
    362		if_cs_write8(card, IF_CS_CMD, buf[nb-1]);
    363
    364	/* "Assert the download over interrupt command in the Host
    365	 * status register" */
    366	if_cs_write16(card, IF_CS_HOST_STATUS, IF_CS_BIT_COMMAND);
    367
    368	/* "Assert the download over interrupt command in the Card
    369	 * interrupt case register" */
    370	if_cs_write16(card, IF_CS_HOST_INT_CAUSE, IF_CS_BIT_COMMAND);
    371	ret = 0;
    372
    373done:
    374	if_cs_enable_ints(card);
    375	return ret;
    376}
    377
    378/*
    379 * Called from if_cs_host_to_card to send a data to the hardware
    380 */
    381static void if_cs_send_data(struct lbs_private *priv, u8 *buf, u16 nb)
    382{
    383	struct if_cs_card *card = (struct if_cs_card *)priv->card;
    384	u16 status;
    385
    386	if_cs_disable_ints(card);
    387
    388	status = if_cs_read16(card, IF_CS_CARD_STATUS);
    389	BUG_ON((status & IF_CS_BIT_TX) == 0);
    390
    391	if_cs_write16(card, IF_CS_WRITE_LEN, nb);
    392
    393	/* write even number of bytes, then odd byte if necessary */
    394	if_cs_write16_rep(card, IF_CS_WRITE, buf, nb / 2);
    395	if (nb & 1)
    396		if_cs_write8(card, IF_CS_WRITE, buf[nb-1]);
    397
    398	if_cs_write16(card, IF_CS_HOST_STATUS, IF_CS_BIT_TX);
    399	if_cs_write16(card, IF_CS_HOST_INT_CAUSE, IF_CS_BIT_TX);
    400	if_cs_enable_ints(card);
    401}
    402
    403/*
    404 * Get the command result out of the card.
    405 */
    406static int if_cs_receive_cmdres(struct lbs_private *priv, u8 *data, u32 *len)
    407{
    408	unsigned long flags;
    409	int ret = -1;
    410	u16 status;
    411
    412	/* is hardware ready? */
    413	status = if_cs_read16(priv->card, IF_CS_CARD_STATUS);
    414	if ((status & IF_CS_BIT_RESP) == 0) {
    415		netdev_err(priv->dev, "no cmd response in card\n");
    416		*len = 0;
    417		goto out;
    418	}
    419
    420	*len = if_cs_read16(priv->card, IF_CS_RESP_LEN);
    421	if ((*len == 0) || (*len > LBS_CMD_BUFFER_SIZE)) {
    422		netdev_err(priv->dev,
    423			   "card cmd buffer has invalid # of bytes (%d)\n",
    424			   *len);
    425		goto out;
    426	}
    427
    428	/* read even number of bytes, then odd byte if necessary */
    429	if_cs_read16_rep(priv->card, IF_CS_RESP, data, *len/sizeof(u16));
    430	if (*len & 1)
    431		data[*len-1] = if_cs_read8(priv->card, IF_CS_RESP);
    432
    433	/* This is a workaround for a firmware that reports too much
    434	 * bytes */
    435	*len -= 8;
    436	ret = 0;
    437
    438	/* Clear this flag again */
    439	spin_lock_irqsave(&priv->driver_lock, flags);
    440	priv->dnld_sent = DNLD_RES_RECEIVED;
    441	spin_unlock_irqrestore(&priv->driver_lock, flags);
    442
    443out:
    444	return ret;
    445}
    446
    447static struct sk_buff *if_cs_receive_data(struct lbs_private *priv)
    448{
    449	struct sk_buff *skb = NULL;
    450	u16 len;
    451	u8 *data;
    452
    453	len = if_cs_read16(priv->card, IF_CS_READ_LEN);
    454	if (len == 0 || len > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE) {
    455		netdev_err(priv->dev,
    456			   "card data buffer has invalid # of bytes (%d)\n",
    457			   len);
    458		priv->dev->stats.rx_dropped++;
    459		goto dat_err;
    460	}
    461
    462	skb = dev_alloc_skb(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE + 2);
    463	if (!skb)
    464		goto out;
    465	skb_put(skb, len);
    466	skb_reserve(skb, 2);/* 16 byte align */
    467	data = skb->data;
    468
    469	/* read even number of bytes, then odd byte if necessary */
    470	if_cs_read16_rep(priv->card, IF_CS_READ, data, len/sizeof(u16));
    471	if (len & 1)
    472		data[len-1] = if_cs_read8(priv->card, IF_CS_READ);
    473
    474dat_err:
    475	if_cs_write16(priv->card, IF_CS_HOST_STATUS, IF_CS_BIT_RX);
    476	if_cs_write16(priv->card, IF_CS_HOST_INT_CAUSE, IF_CS_BIT_RX);
    477
    478out:
    479	return skb;
    480}
    481
    482static irqreturn_t if_cs_interrupt(int irq, void *data)
    483{
    484	struct if_cs_card *card = data;
    485	struct lbs_private *priv = card->priv;
    486	u16 cause;
    487
    488	/* Ask card interrupt cause register if there is something for us */
    489	cause = if_cs_read16(card, IF_CS_CARD_INT_CAUSE);
    490	lbs_deb_cs("cause 0x%04x\n", cause);
    491
    492	if (cause == 0) {
    493		/* Not for us */
    494		return IRQ_NONE;
    495	}
    496
    497	if (cause == 0xffff) {
    498		/* Read in junk, the card has probably been removed */
    499		card->priv->surpriseremoved = 1;
    500		return IRQ_HANDLED;
    501	}
    502
    503	if (cause & IF_CS_BIT_RX) {
    504		struct sk_buff *skb;
    505		lbs_deb_cs("rx packet\n");
    506		skb = if_cs_receive_data(priv);
    507		if (skb)
    508			lbs_process_rxed_packet(priv, skb);
    509	}
    510
    511	if (cause & IF_CS_BIT_TX) {
    512		lbs_deb_cs("tx done\n");
    513		lbs_host_to_card_done(priv);
    514	}
    515
    516	if (cause & IF_CS_BIT_RESP) {
    517		unsigned long flags;
    518		u8 i;
    519
    520		lbs_deb_cs("cmd resp\n");
    521		spin_lock_irqsave(&priv->driver_lock, flags);
    522		i = (priv->resp_idx == 0) ? 1 : 0;
    523		spin_unlock_irqrestore(&priv->driver_lock, flags);
    524
    525		BUG_ON(priv->resp_len[i]);
    526		if_cs_receive_cmdres(priv, priv->resp_buf[i],
    527			&priv->resp_len[i]);
    528
    529		spin_lock_irqsave(&priv->driver_lock, flags);
    530		lbs_notify_command_response(priv, i);
    531		spin_unlock_irqrestore(&priv->driver_lock, flags);
    532	}
    533
    534	if (cause & IF_CS_BIT_EVENT) {
    535		u16 status = if_cs_read16(priv->card, IF_CS_CARD_STATUS);
    536		if_cs_write16(priv->card, IF_CS_HOST_INT_CAUSE,
    537			IF_CS_BIT_EVENT);
    538		lbs_queue_event(priv, (status & IF_CS_CARD_STATUS_MASK) >> 8);
    539	}
    540
    541	/* Clear interrupt cause */
    542	if_cs_write16(card, IF_CS_CARD_INT_CAUSE, cause & IF_CS_BIT_MASK);
    543
    544	return IRQ_HANDLED;
    545}
    546
    547
    548
    549
    550/********************************************************************/
    551/* Firmware                                                         */
    552/********************************************************************/
    553
    554/*
    555 * Tries to program the helper firmware.
    556 *
    557 * Return 0 on success
    558 */
    559static int if_cs_prog_helper(struct if_cs_card *card, const struct firmware *fw)
    560{
    561	int ret = 0;
    562	int sent = 0;
    563	u8  scratch;
    564
    565	/*
    566	 * This is the only place where an unaligned register access happens on
    567	 * the CF8305 card, therefore for the sake of speed of the driver, we do
    568	 * the alignment correction here.
    569	 */
    570	if (card->align_regs)
    571		scratch = if_cs_read16(card, IF_CS_SCRATCH) >> 8;
    572	else
    573		scratch = if_cs_read8(card, IF_CS_SCRATCH);
    574
    575	/* "If the value is 0x5a, the firmware is already
    576	 * downloaded successfully"
    577	 */
    578	if (scratch == IF_CS_SCRATCH_HELPER_OK)
    579		goto done;
    580
    581	/* "If the value is != 00, it is invalid value of register */
    582	if (scratch != IF_CS_SCRATCH_BOOT_OK) {
    583		ret = -ENODEV;
    584		goto done;
    585	}
    586
    587	lbs_deb_cs("helper size %td\n", fw->size);
    588
    589	/* "Set the 5 bytes of the helper image to 0" */
    590	/* Not needed, this contains an ARM branch instruction */
    591
    592	for (;;) {
    593		/* "the number of bytes to send is 256" */
    594		int count = 256;
    595		int remain = fw->size - sent;
    596
    597		if (remain < count)
    598			count = remain;
    599
    600		/*
    601		 * "write the number of bytes to be sent to the I/O Command
    602		 * write length register"
    603		 */
    604		if_cs_write16(card, IF_CS_CMD_LEN, count);
    605
    606		/* "write this to I/O Command port register as 16 bit writes */
    607		if (count)
    608			if_cs_write16_rep(card, IF_CS_CMD,
    609				&fw->data[sent],
    610				count >> 1);
    611
    612		/*
    613		 * "Assert the download over interrupt command in the Host
    614		 * status register"
    615		 */
    616		if_cs_write8(card, IF_CS_HOST_STATUS, IF_CS_BIT_COMMAND);
    617
    618		/*
    619		 * "Assert the download over interrupt command in the Card
    620		 * interrupt case register"
    621		 */
    622		if_cs_write16(card, IF_CS_HOST_INT_CAUSE, IF_CS_BIT_COMMAND);
    623
    624		/*
    625		 * "The host polls the Card Status register ... for 50 ms before
    626		 * declaring a failure"
    627		 */
    628		ret = if_cs_poll_while_fw_download(card, IF_CS_CARD_STATUS,
    629			IF_CS_BIT_COMMAND);
    630		if (ret < 0) {
    631			pr_err("can't download helper at 0x%x, ret %d\n",
    632			       sent, ret);
    633			goto done;
    634		}
    635
    636		if (count == 0)
    637			break;
    638
    639		sent += count;
    640	}
    641
    642done:
    643	return ret;
    644}
    645
    646
    647static int if_cs_prog_real(struct if_cs_card *card, const struct firmware *fw)
    648{
    649	int ret = 0;
    650	int retry = 0;
    651	int len = 0;
    652	int sent;
    653
    654	lbs_deb_cs("fw size %td\n", fw->size);
    655
    656	ret = if_cs_poll_while_fw_download(card, IF_CS_SQ_READ_LOW,
    657		IF_CS_SQ_HELPER_OK);
    658	if (ret < 0) {
    659		pr_err("helper firmware doesn't answer\n");
    660		goto done;
    661	}
    662
    663	for (sent = 0; sent < fw->size; sent += len) {
    664		len = if_cs_read16(card, IF_CS_SQ_READ_LOW);
    665		if (len & 1) {
    666			retry++;
    667			pr_info("odd, need to retry this firmware block\n");
    668		} else {
    669			retry = 0;
    670		}
    671
    672		if (retry > 20) {
    673			pr_err("could not download firmware\n");
    674			ret = -ENODEV;
    675			goto done;
    676		}
    677		if (retry) {
    678			sent -= len;
    679		}
    680
    681
    682		if_cs_write16(card, IF_CS_CMD_LEN, len);
    683
    684		if_cs_write16_rep(card, IF_CS_CMD,
    685			&fw->data[sent],
    686			(len+1) >> 1);
    687		if_cs_write8(card, IF_CS_HOST_STATUS, IF_CS_BIT_COMMAND);
    688		if_cs_write16(card, IF_CS_HOST_INT_CAUSE, IF_CS_BIT_COMMAND);
    689
    690		ret = if_cs_poll_while_fw_download(card, IF_CS_CARD_STATUS,
    691			IF_CS_BIT_COMMAND);
    692		if (ret < 0) {
    693			pr_err("can't download firmware at 0x%x\n", sent);
    694			goto done;
    695		}
    696	}
    697
    698	ret = if_cs_poll_while_fw_download(card, IF_CS_SCRATCH, 0x5a);
    699	if (ret < 0)
    700		pr_err("firmware download failed\n");
    701
    702done:
    703	return ret;
    704}
    705
    706static void if_cs_prog_firmware(struct lbs_private *priv, int ret,
    707				 const struct firmware *helper,
    708				 const struct firmware *mainfw)
    709{
    710	struct if_cs_card *card = priv->card;
    711
    712	if (ret) {
    713		pr_err("failed to find firmware (%d)\n", ret);
    714		return;
    715	}
    716
    717	/* Load the firmware */
    718	ret = if_cs_prog_helper(card, helper);
    719	if (ret == 0 && (card->model != MODEL_8305))
    720		ret = if_cs_prog_real(card, mainfw);
    721	if (ret)
    722		return;
    723
    724	/* Now actually get the IRQ */
    725	ret = request_irq(card->p_dev->irq, if_cs_interrupt,
    726		IRQF_SHARED, DRV_NAME, card);
    727	if (ret) {
    728		pr_err("error in request_irq\n");
    729		return;
    730	}
    731
    732	/*
    733	 * Clear any interrupt cause that happened while sending
    734	 * firmware/initializing card
    735	 */
    736	if_cs_write16(card, IF_CS_CARD_INT_CAUSE, IF_CS_BIT_MASK);
    737	if_cs_enable_ints(card);
    738
    739	/* And finally bring the card up */
    740	priv->fw_ready = 1;
    741	if (lbs_start_card(priv) != 0) {
    742		pr_err("could not activate card\n");
    743		free_irq(card->p_dev->irq, card);
    744	}
    745}
    746
    747
    748/********************************************************************/
    749/* Callback functions for libertas.ko                               */
    750/********************************************************************/
    751
    752/* Send commands or data packets to the card */
    753static int if_cs_host_to_card(struct lbs_private *priv,
    754	u8 type,
    755	u8 *buf,
    756	u16 nb)
    757{
    758	int ret = -1;
    759
    760	switch (type) {
    761	case MVMS_DAT:
    762		priv->dnld_sent = DNLD_DATA_SENT;
    763		if_cs_send_data(priv, buf, nb);
    764		ret = 0;
    765		break;
    766	case MVMS_CMD:
    767		priv->dnld_sent = DNLD_CMD_SENT;
    768		ret = if_cs_send_cmd(priv, buf, nb);
    769		break;
    770	default:
    771		netdev_err(priv->dev, "%s: unsupported type %d\n",
    772			   __func__, type);
    773	}
    774
    775	return ret;
    776}
    777
    778
    779static void if_cs_release(struct pcmcia_device *p_dev)
    780{
    781	struct if_cs_card *card = p_dev->priv;
    782
    783	free_irq(p_dev->irq, card);
    784	pcmcia_disable_device(p_dev);
    785	if (card->iobase)
    786		ioport_unmap(card->iobase);
    787}
    788
    789
    790static int if_cs_ioprobe(struct pcmcia_device *p_dev, void *priv_data)
    791{
    792	p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
    793	p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
    794
    795	if (p_dev->resource[1]->end) {
    796		pr_err("wrong CIS (check number of IO windows)\n");
    797		return -ENODEV;
    798	}
    799
    800	/* This reserves IO space but doesn't actually enable it */
    801	return pcmcia_request_io(p_dev);
    802}
    803
    804static int if_cs_probe(struct pcmcia_device *p_dev)
    805{
    806	int ret = -ENOMEM;
    807	unsigned int prod_id;
    808	struct lbs_private *priv;
    809	struct if_cs_card *card;
    810
    811	card = kzalloc(sizeof(struct if_cs_card), GFP_KERNEL);
    812	if (!card)
    813		goto out;
    814
    815	card->p_dev = p_dev;
    816	p_dev->priv = card;
    817
    818	p_dev->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
    819
    820	if (pcmcia_loop_config(p_dev, if_cs_ioprobe, NULL)) {
    821		pr_err("error in pcmcia_loop_config\n");
    822		goto out1;
    823	}
    824
    825	/*
    826	 * Allocate an interrupt line.  Note that this does not assign
    827	 * a handler to the interrupt, unless the 'Handler' member of
    828	 * the irq structure is initialized.
    829	 */
    830	if (!p_dev->irq)
    831		goto out1;
    832
    833	/* Initialize io access */
    834	card->iobase = ioport_map(p_dev->resource[0]->start,
    835				resource_size(p_dev->resource[0]));
    836	if (!card->iobase) {
    837		pr_err("error in ioport_map\n");
    838		ret = -EIO;
    839		goto out1;
    840	}
    841
    842	ret = pcmcia_enable_device(p_dev);
    843	if (ret) {
    844		pr_err("error in pcmcia_enable_device\n");
    845		goto out2;
    846	}
    847
    848	/* Finally, report what we've done */
    849	lbs_deb_cs("irq %d, io %pR", p_dev->irq, p_dev->resource[0]);
    850
    851	/*
    852	 * Most of the libertas cards can do unaligned register access, but some
    853	 * weird ones cannot. That's especially true for the CF8305 card.
    854	 */
    855	card->align_regs = false;
    856
    857	card->model = get_model(p_dev->manf_id, p_dev->card_id);
    858	if (card->model == MODEL_UNKNOWN) {
    859		pr_err("unsupported manf_id 0x%04x / card_id 0x%04x\n",
    860		       p_dev->manf_id, p_dev->card_id);
    861		ret = -ENODEV;
    862		goto out2;
    863	}
    864
    865	/* Check if we have a current silicon */
    866	prod_id = if_cs_read8(card, IF_CS_PRODUCT_ID);
    867	if (card->model == MODEL_8305) {
    868		card->align_regs = true;
    869		if (prod_id < IF_CS_CF8305_B1_REV) {
    870			pr_err("8305 rev B0 and older are not supported\n");
    871			ret = -ENODEV;
    872			goto out2;
    873		}
    874	}
    875
    876	if ((card->model == MODEL_8381) && prod_id < IF_CS_CF8381_B3_REV) {
    877		pr_err("8381 rev B2 and older are not supported\n");
    878		ret = -ENODEV;
    879		goto out2;
    880	}
    881
    882	if ((card->model == MODEL_8385) && prod_id < IF_CS_CF8385_B1_REV) {
    883		pr_err("8385 rev B0 and older are not supported\n");
    884		ret = -ENODEV;
    885		goto out2;
    886	}
    887
    888	/* Make this card known to the libertas driver */
    889	priv = lbs_add_card(card, &p_dev->dev);
    890	if (IS_ERR(priv)) {
    891		ret = PTR_ERR(priv);
    892		goto out2;
    893	}
    894
    895	/* Set up fields in lbs_private */
    896	card->priv = priv;
    897	priv->card = card;
    898	priv->hw_host_to_card = if_cs_host_to_card;
    899	priv->enter_deep_sleep = NULL;
    900	priv->exit_deep_sleep = NULL;
    901	priv->reset_deep_sleep_wakeup = NULL;
    902
    903	/* Get firmware */
    904	ret = lbs_get_firmware_async(priv, &p_dev->dev, card->model, fw_table,
    905				     if_cs_prog_firmware);
    906	if (ret) {
    907		pr_err("failed to find firmware (%d)\n", ret);
    908		goto out3;
    909	}
    910
    911	goto out;
    912
    913out3:
    914	lbs_remove_card(priv);
    915out2:
    916	ioport_unmap(card->iobase);
    917out1:
    918	pcmcia_disable_device(p_dev);
    919out:
    920	return ret;
    921}
    922
    923
    924static void if_cs_detach(struct pcmcia_device *p_dev)
    925{
    926	struct if_cs_card *card = p_dev->priv;
    927
    928	lbs_stop_card(card->priv);
    929	lbs_remove_card(card->priv);
    930	if_cs_disable_ints(card);
    931	if_cs_release(p_dev);
    932	kfree(card);
    933}
    934
    935
    936
    937/********************************************************************/
    938/* Module initialization                                            */
    939/********************************************************************/
    940
    941static const struct pcmcia_device_id if_cs_ids[] = {
    942	PCMCIA_DEVICE_MANF_CARD(CF8305_MANFID, CF8305_CARDID),
    943	PCMCIA_DEVICE_MANF_CARD(CF8381_MANFID, CF8381_CARDID),
    944	PCMCIA_DEVICE_MANF_CARD(CF8385_MANFID, CF8385_CARDID),
    945	/* NOTE: keep in sync with get_model() */
    946	PCMCIA_DEVICE_NULL,
    947};
    948MODULE_DEVICE_TABLE(pcmcia, if_cs_ids);
    949
    950static struct pcmcia_driver lbs_driver = {
    951	.owner		= THIS_MODULE,
    952	.name		= DRV_NAME,
    953	.probe		= if_cs_probe,
    954	.remove		= if_cs_detach,
    955	.id_table       = if_cs_ids,
    956};
    957module_pcmcia_driver(lbs_driver);