root/drivers/net/wireless/marvell/libertas/if_spi.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. free_if_spi_card
  2. spu_transaction_init
  3. spu_transaction_finish
  4. spu_write
  5. spu_write_u16
  6. spu_reg_is_port_reg
  7. spu_read
  8. spu_read_u16
  9. spu_read_u32
  10. spu_wait_for_u16
  11. spu_wait_for_u32
  12. spu_set_interrupt_mode
  13. spu_get_chip_revision
  14. spu_set_bus_mode
  15. spu_init
  16. if_spi_prog_helper_firmware
  17. if_spi_prog_main_firmware_check_len
  18. if_spi_prog_main_firmware
  19. if_spi_c2h_cmd
  20. if_spi_c2h_data
  21. if_spi_h2c
  22. if_spi_e2h
  23. if_spi_host_to_card_worker
  24. if_spi_host_to_card
  25. if_spi_host_interrupt
  26. if_spi_init_card
  27. if_spi_resume_worker
  28. if_spi_probe
  29. libertas_spi_remove
  30. if_spi_suspend
  31. if_spi_resume
  32. if_spi_init_module
  33. if_spi_exit_module

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  *      linux/drivers/net/wireless/libertas/if_spi.c
   4  *
   5  *      Driver for Marvell SPI WLAN cards.
   6  *
   7  *      Copyright 2008 Analog Devices Inc.
   8  *
   9  *      Authors:
  10  *      Andrey Yurovsky <andrey@cozybit.com>
  11  *      Colin McCabe <colin@cozybit.com>
  12  *
  13  *      Inspired by if_sdio.c, Copyright 2007-2008 Pierre Ossman
  14  */
  15 
  16 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  17 
  18 #include <linux/hardirq.h>
  19 #include <linux/interrupt.h>
  20 #include <linux/module.h>
  21 #include <linux/firmware.h>
  22 #include <linux/jiffies.h>
  23 #include <linux/list.h>
  24 #include <linux/netdevice.h>
  25 #include <linux/slab.h>
  26 #include <linux/spi/libertas_spi.h>
  27 #include <linux/spi/spi.h>
  28 
  29 #include "host.h"
  30 #include "decl.h"
  31 #include "defs.h"
  32 #include "dev.h"
  33 #include "if_spi.h"
  34 
  35 struct if_spi_packet {
  36         struct list_head                list;
  37         u16                             blen;
  38         u8                              buffer[0] __attribute__((aligned(4)));
  39 };
  40 
  41 struct if_spi_card {
  42         struct spi_device               *spi;
  43         struct lbs_private              *priv;
  44         struct libertas_spi_platform_data *pdata;
  45 
  46         /* The card ID and card revision, as reported by the hardware. */
  47         u16                             card_id;
  48         u8                              card_rev;
  49 
  50         /* The last time that we initiated an SPU operation */
  51         unsigned long                   prev_xfer_time;
  52 
  53         int                             use_dummy_writes;
  54         unsigned long                   spu_port_delay;
  55         unsigned long                   spu_reg_delay;
  56 
  57         /* Handles all SPI communication (except for FW load) */
  58         struct workqueue_struct         *workqueue;
  59         struct work_struct              packet_work;
  60         struct work_struct              resume_work;
  61 
  62         u8                              cmd_buffer[IF_SPI_CMD_BUF_SIZE];
  63 
  64         /* A buffer of incoming packets from libertas core.
  65          * Since we can't sleep in hw_host_to_card, we have to buffer
  66          * them. */
  67         struct list_head                cmd_packet_list;
  68         struct list_head                data_packet_list;
  69 
  70         /* Protects cmd_packet_list and data_packet_list */
  71         spinlock_t                      buffer_lock;
  72 
  73         /* True is card suspended */
  74         u8                              suspended;
  75 };
  76 
  77 static void free_if_spi_card(struct if_spi_card *card)
  78 {
  79         struct list_head *cursor, *next;
  80         struct if_spi_packet *packet;
  81 
  82         list_for_each_safe(cursor, next, &card->cmd_packet_list) {
  83                 packet = container_of(cursor, struct if_spi_packet, list);
  84                 list_del(&packet->list);
  85                 kfree(packet);
  86         }
  87         list_for_each_safe(cursor, next, &card->data_packet_list) {
  88                 packet = container_of(cursor, struct if_spi_packet, list);
  89                 list_del(&packet->list);
  90                 kfree(packet);
  91         }
  92         kfree(card);
  93 }
  94 
  95 #define MODEL_8385      0x04
  96 #define MODEL_8686      0x0b
  97 #define MODEL_8688      0x10
  98 
  99 static const struct lbs_fw_table fw_table[] = {
 100         { MODEL_8385, "libertas/gspi8385_helper.bin", "libertas/gspi8385.bin" },
 101         { MODEL_8385, "libertas/gspi8385_hlp.bin", "libertas/gspi8385.bin" },
 102         { MODEL_8686, "libertas/gspi8686_v9_helper.bin", "libertas/gspi8686_v9.bin" },
 103         { MODEL_8686, "libertas/gspi8686_hlp.bin", "libertas/gspi8686.bin" },
 104         { MODEL_8688, "libertas/gspi8688_helper.bin", "libertas/gspi8688.bin" },
 105         { 0, NULL, NULL }
 106 };
 107 MODULE_FIRMWARE("libertas/gspi8385_helper.bin");
 108 MODULE_FIRMWARE("libertas/gspi8385_hlp.bin");
 109 MODULE_FIRMWARE("libertas/gspi8385.bin");
 110 MODULE_FIRMWARE("libertas/gspi8686_v9_helper.bin");
 111 MODULE_FIRMWARE("libertas/gspi8686_v9.bin");
 112 MODULE_FIRMWARE("libertas/gspi8686_hlp.bin");
 113 MODULE_FIRMWARE("libertas/gspi8686.bin");
 114 MODULE_FIRMWARE("libertas/gspi8688_helper.bin");
 115 MODULE_FIRMWARE("libertas/gspi8688.bin");
 116 
 117 
 118 /*
 119  * SPI Interface Unit Routines
 120  *
 121  * The SPU sits between the host and the WLAN module.
 122  * All communication with the firmware is through SPU transactions.
 123  *
 124  * First we have to put a SPU register name on the bus. Then we can
 125  * either read from or write to that register.
 126  *
 127  */
 128 
 129 static void spu_transaction_init(struct if_spi_card *card)
 130 {
 131         if (!time_after(jiffies, card->prev_xfer_time + 1)) {
 132                 /* Unfortunately, the SPU requires a delay between successive
 133                  * transactions. If our last transaction was more than a jiffy
 134                  * ago, we have obviously already delayed enough.
 135                  * If not, we have to busy-wait to be on the safe side. */
 136                 ndelay(400);
 137         }
 138 }
 139 
 140 static void spu_transaction_finish(struct if_spi_card *card)
 141 {
 142         card->prev_xfer_time = jiffies;
 143 }
 144 
 145 /*
 146  * Write out a byte buffer to an SPI register,
 147  * using a series of 16-bit transfers.
 148  */
 149 static int spu_write(struct if_spi_card *card, u16 reg, const u8 *buf, int len)
 150 {
 151         int err = 0;
 152         __le16 reg_out = cpu_to_le16(reg | IF_SPI_WRITE_OPERATION_MASK);
 153         struct spi_message m;
 154         struct spi_transfer reg_trans;
 155         struct spi_transfer data_trans;
 156 
 157         spi_message_init(&m);
 158         memset(&reg_trans, 0, sizeof(reg_trans));
 159         memset(&data_trans, 0, sizeof(data_trans));
 160 
 161         /* You must give an even number of bytes to the SPU, even if it
 162          * doesn't care about the last one.  */
 163         BUG_ON(len & 0x1);
 164 
 165         spu_transaction_init(card);
 166 
 167         /* write SPU register index */
 168         reg_trans.tx_buf = &reg_out;
 169         reg_trans.len = sizeof(reg_out);
 170 
 171         data_trans.tx_buf = buf;
 172         data_trans.len = len;
 173 
 174         spi_message_add_tail(&reg_trans, &m);
 175         spi_message_add_tail(&data_trans, &m);
 176 
 177         err = spi_sync(card->spi, &m);
 178         spu_transaction_finish(card);
 179         return err;
 180 }
 181 
 182 static inline int spu_write_u16(struct if_spi_card *card, u16 reg, u16 val)
 183 {
 184         __le16 buff;
 185 
 186         buff = cpu_to_le16(val);
 187         return spu_write(card, reg, (u8 *)&buff, sizeof(u16));
 188 }
 189 
 190 static inline int spu_reg_is_port_reg(u16 reg)
 191 {
 192         switch (reg) {
 193         case IF_SPI_IO_RDWRPORT_REG:
 194         case IF_SPI_CMD_RDWRPORT_REG:
 195         case IF_SPI_DATA_RDWRPORT_REG:
 196                 return 1;
 197         default:
 198                 return 0;
 199         }
 200 }
 201 
 202 static int spu_read(struct if_spi_card *card, u16 reg, u8 *buf, int len)
 203 {
 204         unsigned int delay;
 205         int err = 0;
 206         __le16 reg_out = cpu_to_le16(reg | IF_SPI_READ_OPERATION_MASK);
 207         struct spi_message m;
 208         struct spi_transfer reg_trans;
 209         struct spi_transfer dummy_trans;
 210         struct spi_transfer data_trans;
 211 
 212         /*
 213          * You must take an even number of bytes from the SPU, even if you
 214          * don't care about the last one.
 215          */
 216         BUG_ON(len & 0x1);
 217 
 218         spu_transaction_init(card);
 219 
 220         spi_message_init(&m);
 221         memset(&reg_trans, 0, sizeof(reg_trans));
 222         memset(&dummy_trans, 0, sizeof(dummy_trans));
 223         memset(&data_trans, 0, sizeof(data_trans));
 224 
 225         /* write SPU register index */
 226         reg_trans.tx_buf = &reg_out;
 227         reg_trans.len = sizeof(reg_out);
 228         spi_message_add_tail(&reg_trans, &m);
 229 
 230         delay = spu_reg_is_port_reg(reg) ? card->spu_port_delay :
 231                                                 card->spu_reg_delay;
 232         if (card->use_dummy_writes) {
 233                 /* Clock in dummy cycles while the SPU fills the FIFO */
 234                 dummy_trans.len = delay / 8;
 235                 spi_message_add_tail(&dummy_trans, &m);
 236         } else {
 237                 /* Busy-wait while the SPU fills the FIFO */
 238                 reg_trans.delay_usecs =
 239                         DIV_ROUND_UP((100 + (delay * 10)), 1000);
 240         }
 241 
 242         /* read in data */
 243         data_trans.rx_buf = buf;
 244         data_trans.len = len;
 245         spi_message_add_tail(&data_trans, &m);
 246 
 247         err = spi_sync(card->spi, &m);
 248         spu_transaction_finish(card);
 249         return err;
 250 }
 251 
 252 /* Read 16 bits from an SPI register */
 253 static inline int spu_read_u16(struct if_spi_card *card, u16 reg, u16 *val)
 254 {
 255         __le16 buf;
 256         int ret;
 257 
 258         ret = spu_read(card, reg, (u8 *)&buf, sizeof(buf));
 259         if (ret == 0)
 260                 *val = le16_to_cpup(&buf);
 261         return ret;
 262 }
 263 
 264 /*
 265  * Read 32 bits from an SPI register.
 266  * The low 16 bits are read first.
 267  */
 268 static int spu_read_u32(struct if_spi_card *card, u16 reg, u32 *val)
 269 {
 270         __le32 buf;
 271         int err;
 272 
 273         err = spu_read(card, reg, (u8 *)&buf, sizeof(buf));
 274         if (!err)
 275                 *val = le32_to_cpup(&buf);
 276         return err;
 277 }
 278 
 279 /*
 280  * Keep reading 16 bits from an SPI register until you get the correct result.
 281  *
 282  * If mask = 0, the correct result is any non-zero number.
 283  * If mask != 0, the correct result is any number where
 284  * number & target_mask == target
 285  *
 286  * Returns -ETIMEDOUT if a second passes without the correct result.
 287  */
 288 static int spu_wait_for_u16(struct if_spi_card *card, u16 reg,
 289                         u16 target_mask, u16 target)
 290 {
 291         int err;
 292         unsigned long timeout = jiffies + 5*HZ;
 293         while (1) {
 294                 u16 val;
 295                 err = spu_read_u16(card, reg, &val);
 296                 if (err)
 297                         return err;
 298                 if (target_mask) {
 299                         if ((val & target_mask) == target)
 300                                 return 0;
 301                 } else {
 302                         if (val)
 303                                 return 0;
 304                 }
 305                 udelay(100);
 306                 if (time_after(jiffies, timeout)) {
 307                         pr_err("%s: timeout with val=%02x, target_mask=%02x, target=%02x\n",
 308                                __func__, val, target_mask, target);
 309                         return -ETIMEDOUT;
 310                 }
 311         }
 312 }
 313 
 314 /*
 315  * Read 16 bits from an SPI register until you receive a specific value.
 316  * Returns -ETIMEDOUT if a 4 tries pass without success.
 317  */
 318 static int spu_wait_for_u32(struct if_spi_card *card, u32 reg, u32 target)
 319 {
 320         int err, try;
 321         for (try = 0; try < 4; ++try) {
 322                 u32 val = 0;
 323                 err = spu_read_u32(card, reg, &val);
 324                 if (err)
 325                         return err;
 326                 if (val == target)
 327                         return 0;
 328                 mdelay(100);
 329         }
 330         return -ETIMEDOUT;
 331 }
 332 
 333 static int spu_set_interrupt_mode(struct if_spi_card *card,
 334                            int suppress_host_int,
 335                            int auto_int)
 336 {
 337         int err = 0;
 338 
 339         /*
 340          * We can suppress a host interrupt by clearing the appropriate
 341          * bit in the "host interrupt status mask" register
 342          */
 343         if (suppress_host_int) {
 344                 err = spu_write_u16(card, IF_SPI_HOST_INT_STATUS_MASK_REG, 0);
 345                 if (err)
 346                         return err;
 347         } else {
 348                 err = spu_write_u16(card, IF_SPI_HOST_INT_STATUS_MASK_REG,
 349                               IF_SPI_HISM_TX_DOWNLOAD_RDY |
 350                               IF_SPI_HISM_RX_UPLOAD_RDY |
 351                               IF_SPI_HISM_CMD_DOWNLOAD_RDY |
 352                               IF_SPI_HISM_CARDEVENT |
 353                               IF_SPI_HISM_CMD_UPLOAD_RDY);
 354                 if (err)
 355                         return err;
 356         }
 357 
 358         /*
 359          * If auto-interrupts are on, the completion of certain transactions
 360          * will trigger an interrupt automatically. If auto-interrupts
 361          * are off, we need to set the "Card Interrupt Cause" register to
 362          * trigger a card interrupt.
 363          */
 364         if (auto_int) {
 365                 err = spu_write_u16(card, IF_SPI_HOST_INT_CTRL_REG,
 366                                 IF_SPI_HICT_TX_DOWNLOAD_OVER_AUTO |
 367                                 IF_SPI_HICT_RX_UPLOAD_OVER_AUTO |
 368                                 IF_SPI_HICT_CMD_DOWNLOAD_OVER_AUTO |
 369                                 IF_SPI_HICT_CMD_UPLOAD_OVER_AUTO);
 370                 if (err)
 371                         return err;
 372         } else {
 373                 err = spu_write_u16(card, IF_SPI_HOST_INT_STATUS_MASK_REG, 0);
 374                 if (err)
 375                         return err;
 376         }
 377         return err;
 378 }
 379 
 380 static int spu_get_chip_revision(struct if_spi_card *card,
 381                                   u16 *card_id, u8 *card_rev)
 382 {
 383         int err = 0;
 384         u32 dev_ctrl;
 385         err = spu_read_u32(card, IF_SPI_DEVICEID_CTRL_REG, &dev_ctrl);
 386         if (err)
 387                 return err;
 388         *card_id = IF_SPI_DEVICEID_CTRL_REG_TO_CARD_ID(dev_ctrl);
 389         *card_rev = IF_SPI_DEVICEID_CTRL_REG_TO_CARD_REV(dev_ctrl);
 390         return err;
 391 }
 392 
 393 static int spu_set_bus_mode(struct if_spi_card *card, u16 mode)
 394 {
 395         int err = 0;
 396         u16 rval;
 397         /* set bus mode */
 398         err = spu_write_u16(card, IF_SPI_SPU_BUS_MODE_REG, mode);
 399         if (err)
 400                 return err;
 401         /* Check that we were able to read back what we just wrote. */
 402         err = spu_read_u16(card, IF_SPI_SPU_BUS_MODE_REG, &rval);
 403         if (err)
 404                 return err;
 405         if ((rval & 0xF) != mode) {
 406                 pr_err("Can't read bus mode register\n");
 407                 return -EIO;
 408         }
 409         return 0;
 410 }
 411 
 412 static int spu_init(struct if_spi_card *card, int use_dummy_writes)
 413 {
 414         int err = 0;
 415         u32 delay;
 416 
 417         /*
 418          * We have to start up in timed delay mode so that we can safely
 419          * read the Delay Read Register.
 420          */
 421         card->use_dummy_writes = 0;
 422         err = spu_set_bus_mode(card,
 423                                 IF_SPI_BUS_MODE_SPI_CLOCK_PHASE_RISING |
 424                                 IF_SPI_BUS_MODE_DELAY_METHOD_TIMED |
 425                                 IF_SPI_BUS_MODE_16_BIT_ADDRESS_16_BIT_DATA);
 426         if (err)
 427                 return err;
 428         card->spu_port_delay = 1000;
 429         card->spu_reg_delay = 1000;
 430         err = spu_read_u32(card, IF_SPI_DELAY_READ_REG, &delay);
 431         if (err)
 432                 return err;
 433         card->spu_port_delay = delay & 0x0000ffff;
 434         card->spu_reg_delay = (delay & 0xffff0000) >> 16;
 435 
 436         /* If dummy clock delay mode has been requested, switch to it now */
 437         if (use_dummy_writes) {
 438                 card->use_dummy_writes = 1;
 439                 err = spu_set_bus_mode(card,
 440                                 IF_SPI_BUS_MODE_SPI_CLOCK_PHASE_RISING |
 441                                 IF_SPI_BUS_MODE_DELAY_METHOD_DUMMY_CLOCK |
 442                                 IF_SPI_BUS_MODE_16_BIT_ADDRESS_16_BIT_DATA);
 443                 if (err)
 444                         return err;
 445         }
 446 
 447         lbs_deb_spi("Initialized SPU unit. "
 448                     "spu_port_delay=0x%04lx, spu_reg_delay=0x%04lx\n",
 449                     card->spu_port_delay, card->spu_reg_delay);
 450         return err;
 451 }
 452 
 453 /*
 454  * Firmware Loading
 455  */
 456 
 457 static int if_spi_prog_helper_firmware(struct if_spi_card *card,
 458                                         const struct firmware *firmware)
 459 {
 460         int err = 0;
 461         int bytes_remaining;
 462         const u8 *fw;
 463         u8 temp[HELPER_FW_LOAD_CHUNK_SZ];
 464 
 465         err = spu_set_interrupt_mode(card, 1, 0);
 466         if (err)
 467                 goto out;
 468 
 469         bytes_remaining = firmware->size;
 470         fw = firmware->data;
 471 
 472         /* Load helper firmware image */
 473         while (bytes_remaining > 0) {
 474                 /*
 475                  * Scratch pad 1 should contain the number of bytes we
 476                  * want to download to the firmware
 477                  */
 478                 err = spu_write_u16(card, IF_SPI_SCRATCH_1_REG,
 479                                         HELPER_FW_LOAD_CHUNK_SZ);
 480                 if (err)
 481                         goto out;
 482 
 483                 err = spu_wait_for_u16(card, IF_SPI_HOST_INT_STATUS_REG,
 484                                         IF_SPI_HIST_CMD_DOWNLOAD_RDY,
 485                                         IF_SPI_HIST_CMD_DOWNLOAD_RDY);
 486                 if (err)
 487                         goto out;
 488 
 489                 /*
 490                  * Feed the data into the command read/write port reg
 491                  * in chunks of 64 bytes
 492                  */
 493                 memset(temp, 0, sizeof(temp));
 494                 memcpy(temp, fw,
 495                        min(bytes_remaining, HELPER_FW_LOAD_CHUNK_SZ));
 496                 mdelay(10);
 497                 err = spu_write(card, IF_SPI_CMD_RDWRPORT_REG,
 498                                         temp, HELPER_FW_LOAD_CHUNK_SZ);
 499                 if (err)
 500                         goto out;
 501 
 502                 /* Interrupt the boot code */
 503                 err = spu_write_u16(card, IF_SPI_HOST_INT_STATUS_REG, 0);
 504                 if (err)
 505                         goto out;
 506                 err = spu_write_u16(card, IF_SPI_CARD_INT_CAUSE_REG,
 507                                        IF_SPI_CIC_CMD_DOWNLOAD_OVER);
 508                 if (err)
 509                         goto out;
 510                 bytes_remaining -= HELPER_FW_LOAD_CHUNK_SZ;
 511                 fw += HELPER_FW_LOAD_CHUNK_SZ;
 512         }
 513 
 514         /*
 515          * Once the helper / single stage firmware download is complete,
 516          * write 0 to scratch pad 1 and interrupt the
 517          * bootloader. This completes the helper download.
 518          */
 519         err = spu_write_u16(card, IF_SPI_SCRATCH_1_REG, FIRMWARE_DNLD_OK);
 520         if (err)
 521                 goto out;
 522         err = spu_write_u16(card, IF_SPI_HOST_INT_STATUS_REG, 0);
 523         if (err)
 524                 goto out;
 525         err = spu_write_u16(card, IF_SPI_CARD_INT_CAUSE_REG,
 526                                 IF_SPI_CIC_CMD_DOWNLOAD_OVER);
 527 out:
 528         if (err)
 529                 pr_err("failed to load helper firmware (err=%d)\n", err);
 530 
 531         return err;
 532 }
 533 
 534 /*
 535  * Returns the length of the next packet the firmware expects us to send.
 536  * Sets crc_err if the previous transfer had a CRC error.
 537  */
 538 static int if_spi_prog_main_firmware_check_len(struct if_spi_card *card,
 539                                                 int *crc_err)
 540 {
 541         u16 len;
 542         int err = 0;
 543 
 544         /*
 545          * wait until the host interrupt status register indicates
 546          * that we are ready to download
 547          */
 548         err = spu_wait_for_u16(card, IF_SPI_HOST_INT_STATUS_REG,
 549                                 IF_SPI_HIST_CMD_DOWNLOAD_RDY,
 550                                 IF_SPI_HIST_CMD_DOWNLOAD_RDY);
 551         if (err) {
 552                 pr_err("timed out waiting for host_int_status\n");
 553                 return err;
 554         }
 555 
 556         /* Ask the device how many bytes of firmware it wants. */
 557         err = spu_read_u16(card, IF_SPI_SCRATCH_1_REG, &len);
 558         if (err)
 559                 return err;
 560 
 561         if (len > IF_SPI_CMD_BUF_SIZE) {
 562                 pr_err("firmware load device requested a larger transfer than we are prepared to handle (len = %d)\n",
 563                        len);
 564                 return -EIO;
 565         }
 566         if (len & 0x1) {
 567                 lbs_deb_spi("%s: crc error\n", __func__);
 568                 len &= ~0x1;
 569                 *crc_err = 1;
 570         } else
 571                 *crc_err = 0;
 572 
 573         return len;
 574 }
 575 
 576 static int if_spi_prog_main_firmware(struct if_spi_card *card,
 577                                         const struct firmware *firmware)
 578 {
 579         struct lbs_private *priv = card->priv;
 580         int len, prev_len;
 581         int bytes, crc_err = 0, err = 0;
 582         const u8 *fw;
 583         u16 num_crc_errs;
 584 
 585         err = spu_set_interrupt_mode(card, 1, 0);
 586         if (err)
 587                 goto out;
 588 
 589         err = spu_wait_for_u16(card, IF_SPI_SCRATCH_1_REG, 0, 0);
 590         if (err) {
 591                 netdev_err(priv->dev,
 592                            "%s: timed out waiting for initial scratch reg = 0\n",
 593                            __func__);
 594                 goto out;
 595         }
 596 
 597         num_crc_errs = 0;
 598         prev_len = 0;
 599         bytes = firmware->size;
 600         fw = firmware->data;
 601         while ((len = if_spi_prog_main_firmware_check_len(card, &crc_err))) {
 602                 if (len < 0) {
 603                         err = len;
 604                         goto out;
 605                 }
 606                 if (bytes < 0) {
 607                         /*
 608                          * If there are no more bytes left, we would normally
 609                          * expect to have terminated with len = 0
 610                          */
 611                         netdev_err(priv->dev,
 612                                    "Firmware load wants more bytes than we have to offer.\n");
 613                         break;
 614                 }
 615                 if (crc_err) {
 616                         /* Previous transfer failed. */
 617                         if (++num_crc_errs > MAX_MAIN_FW_LOAD_CRC_ERR) {
 618                                 pr_err("Too many CRC errors encountered in firmware load.\n");
 619                                 err = -EIO;
 620                                 goto out;
 621                         }
 622                 } else {
 623                         /* Previous transfer succeeded. Advance counters. */
 624                         bytes -= prev_len;
 625                         fw += prev_len;
 626                 }
 627                 if (bytes < len) {
 628                         memset(card->cmd_buffer, 0, len);
 629                         memcpy(card->cmd_buffer, fw, bytes);
 630                 } else
 631                         memcpy(card->cmd_buffer, fw, len);
 632 
 633                 err = spu_write_u16(card, IF_SPI_HOST_INT_STATUS_REG, 0);
 634                 if (err)
 635                         goto out;
 636                 err = spu_write(card, IF_SPI_CMD_RDWRPORT_REG,
 637                                 card->cmd_buffer, len);
 638                 if (err)
 639                         goto out;
 640                 err = spu_write_u16(card, IF_SPI_CARD_INT_CAUSE_REG ,
 641                                         IF_SPI_CIC_CMD_DOWNLOAD_OVER);
 642                 if (err)
 643                         goto out;
 644                 prev_len = len;
 645         }
 646         if (bytes > prev_len) {
 647                 pr_err("firmware load wants fewer bytes than we have to offer\n");
 648         }
 649 
 650         /* Confirm firmware download */
 651         err = spu_wait_for_u32(card, IF_SPI_SCRATCH_4_REG,
 652                                         SUCCESSFUL_FW_DOWNLOAD_MAGIC);
 653         if (err) {
 654                 pr_err("failed to confirm the firmware download\n");
 655                 goto out;
 656         }
 657 
 658 out:
 659         if (err)
 660                 pr_err("failed to load firmware (err=%d)\n", err);
 661 
 662         return err;
 663 }
 664 
 665 /*
 666  * SPI Transfer Thread
 667  *
 668  * The SPI worker handles all SPI transfers, so there is no need for a lock.
 669  */
 670 
 671 /* Move a command from the card to the host */
 672 static int if_spi_c2h_cmd(struct if_spi_card *card)
 673 {
 674         struct lbs_private *priv = card->priv;
 675         unsigned long flags;
 676         int err = 0;
 677         u16 len;
 678         u8 i;
 679 
 680         /*
 681          * We need a buffer big enough to handle whatever people send to
 682          * hw_host_to_card
 683          */
 684         BUILD_BUG_ON(IF_SPI_CMD_BUF_SIZE < LBS_CMD_BUFFER_SIZE);
 685         BUILD_BUG_ON(IF_SPI_CMD_BUF_SIZE < LBS_UPLD_SIZE);
 686 
 687         /*
 688          * It's just annoying if the buffer size isn't a multiple of 4, because
 689          * then we might have len < IF_SPI_CMD_BUF_SIZE but
 690          * ALIGN(len, 4) > IF_SPI_CMD_BUF_SIZE
 691          */
 692         BUILD_BUG_ON(IF_SPI_CMD_BUF_SIZE % 4 != 0);
 693 
 694         /* How many bytes are there to read? */
 695         err = spu_read_u16(card, IF_SPI_SCRATCH_2_REG, &len);
 696         if (err)
 697                 goto out;
 698         if (!len) {
 699                 netdev_err(priv->dev, "%s: error: card has no data for host\n",
 700                            __func__);
 701                 err = -EINVAL;
 702                 goto out;
 703         } else if (len > IF_SPI_CMD_BUF_SIZE) {
 704                 netdev_err(priv->dev,
 705                            "%s: error: response packet too large: %d bytes, but maximum is %d\n",
 706                            __func__, len, IF_SPI_CMD_BUF_SIZE);
 707                 err = -EINVAL;
 708                 goto out;
 709         }
 710 
 711         /* Read the data from the WLAN module into our command buffer */
 712         err = spu_read(card, IF_SPI_CMD_RDWRPORT_REG,
 713                                 card->cmd_buffer, ALIGN(len, 4));
 714         if (err)
 715                 goto out;
 716 
 717         spin_lock_irqsave(&priv->driver_lock, flags);
 718         i = (priv->resp_idx == 0) ? 1 : 0;
 719         BUG_ON(priv->resp_len[i]);
 720         priv->resp_len[i] = len;
 721         memcpy(priv->resp_buf[i], card->cmd_buffer, len);
 722         lbs_notify_command_response(priv, i);
 723         spin_unlock_irqrestore(&priv->driver_lock, flags);
 724 
 725 out:
 726         if (err)
 727                 netdev_err(priv->dev, "%s: err=%d\n", __func__, err);
 728 
 729         return err;
 730 }
 731 
 732 /* Move data from the card to the host */
 733 static int if_spi_c2h_data(struct if_spi_card *card)
 734 {
 735         struct lbs_private *priv = card->priv;
 736         struct sk_buff *skb;
 737         char *data;
 738         u16 len;
 739         int err = 0;
 740 
 741         /* How many bytes are there to read? */
 742         err = spu_read_u16(card, IF_SPI_SCRATCH_1_REG, &len);
 743         if (err)
 744                 goto out;
 745         if (!len) {
 746                 netdev_err(priv->dev, "%s: error: card has no data for host\n",
 747                            __func__);
 748                 err = -EINVAL;
 749                 goto out;
 750         } else if (len > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE) {
 751                 netdev_err(priv->dev,
 752                            "%s: error: card has %d bytes of data, but our maximum skb size is %zu\n",
 753                            __func__, len, MRVDRV_ETH_RX_PACKET_BUFFER_SIZE);
 754                 err = -EINVAL;
 755                 goto out;
 756         }
 757 
 758         /* TODO: should we allocate a smaller skb if we have less data? */
 759         skb = dev_alloc_skb(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE);
 760         if (!skb) {
 761                 err = -ENOBUFS;
 762                 goto out;
 763         }
 764         skb_reserve(skb, IPFIELD_ALIGN_OFFSET);
 765         data = skb_put(skb, len);
 766 
 767         /* Read the data from the WLAN module into our skb... */
 768         err = spu_read(card, IF_SPI_DATA_RDWRPORT_REG, data, ALIGN(len, 4));
 769         if (err) {
 770                 dev_kfree_skb(skb);
 771                 goto out;
 772         }
 773 
 774         /* pass the SKB to libertas */
 775         err = lbs_process_rxed_packet(card->priv, skb);
 776         /* lbs_process_rxed_packet() consumes the skb */
 777 
 778 out:
 779         if (err)
 780                 netdev_err(priv->dev, "%s: err=%d\n", __func__, err);
 781 
 782         return err;
 783 }
 784 
 785 /* Move data or a command from the host to the card. */
 786 static void if_spi_h2c(struct if_spi_card *card,
 787                         struct if_spi_packet *packet, int type)
 788 {
 789         struct lbs_private *priv = card->priv;
 790         int err = 0;
 791         u16 port_reg;
 792 
 793         switch (type) {
 794         case MVMS_DAT:
 795                 port_reg = IF_SPI_DATA_RDWRPORT_REG;
 796                 break;
 797         case MVMS_CMD:
 798                 port_reg = IF_SPI_CMD_RDWRPORT_REG;
 799                 break;
 800         default:
 801                 netdev_err(priv->dev, "can't transfer buffer of type %d\n",
 802                            type);
 803                 err = -EINVAL;
 804                 goto out;
 805         }
 806 
 807         /* Write the data to the card */
 808         err = spu_write(card, port_reg, packet->buffer, packet->blen);
 809         if (err)
 810                 goto out;
 811 
 812 out:
 813         kfree(packet);
 814 
 815         if (err)
 816                 netdev_err(priv->dev, "%s: error %d\n", __func__, err);
 817 }
 818 
 819 /* Inform the host about a card event */
 820 static void if_spi_e2h(struct if_spi_card *card)
 821 {
 822         int err = 0;
 823         u32 cause;
 824         struct lbs_private *priv = card->priv;
 825 
 826         err = spu_read_u32(card, IF_SPI_SCRATCH_3_REG, &cause);
 827         if (err)
 828                 goto out;
 829 
 830         /* re-enable the card event interrupt */
 831         spu_write_u16(card, IF_SPI_HOST_INT_STATUS_REG,
 832                         ~IF_SPI_HICU_CARD_EVENT);
 833 
 834         /* generate a card interrupt */
 835         spu_write_u16(card, IF_SPI_CARD_INT_CAUSE_REG, IF_SPI_CIC_HOST_EVENT);
 836 
 837         lbs_queue_event(priv, cause & 0xff);
 838 out:
 839         if (err)
 840                 netdev_err(priv->dev, "%s: error %d\n", __func__, err);
 841 }
 842 
 843 static void if_spi_host_to_card_worker(struct work_struct *work)
 844 {
 845         int err;
 846         struct if_spi_card *card;
 847         u16 hiStatus;
 848         unsigned long flags;
 849         struct if_spi_packet *packet;
 850         struct lbs_private *priv;
 851 
 852         card = container_of(work, struct if_spi_card, packet_work);
 853         priv = card->priv;
 854 
 855         /*
 856          * Read the host interrupt status register to see what we
 857          * can do.
 858          */
 859         err = spu_read_u16(card, IF_SPI_HOST_INT_STATUS_REG,
 860                                 &hiStatus);
 861         if (err) {
 862                 netdev_err(priv->dev, "I/O error\n");
 863                 goto err;
 864         }
 865 
 866         if (hiStatus & IF_SPI_HIST_CMD_UPLOAD_RDY) {
 867                 err = if_spi_c2h_cmd(card);
 868                 if (err)
 869                         goto err;
 870         }
 871         if (hiStatus & IF_SPI_HIST_RX_UPLOAD_RDY) {
 872                 err = if_spi_c2h_data(card);
 873                 if (err)
 874                         goto err;
 875         }
 876 
 877         /*
 878          * workaround: in PS mode, the card does not set the Command
 879          * Download Ready bit, but it sets TX Download Ready.
 880          */
 881         if (hiStatus & IF_SPI_HIST_CMD_DOWNLOAD_RDY ||
 882            (card->priv->psstate != PS_STATE_FULL_POWER &&
 883             (hiStatus & IF_SPI_HIST_TX_DOWNLOAD_RDY))) {
 884                 /*
 885                  * This means two things. First of all,
 886                  * if there was a previous command sent, the card has
 887                  * successfully received it.
 888                  * Secondly, it is now ready to download another
 889                  * command.
 890                  */
 891                 lbs_host_to_card_done(card->priv);
 892 
 893                 /* Do we have any command packets from the host to send? */
 894                 packet = NULL;
 895                 spin_lock_irqsave(&card->buffer_lock, flags);
 896                 if (!list_empty(&card->cmd_packet_list)) {
 897                         packet = (struct if_spi_packet *)(card->
 898                                         cmd_packet_list.next);
 899                         list_del(&packet->list);
 900                 }
 901                 spin_unlock_irqrestore(&card->buffer_lock, flags);
 902 
 903                 if (packet)
 904                         if_spi_h2c(card, packet, MVMS_CMD);
 905         }
 906         if (hiStatus & IF_SPI_HIST_TX_DOWNLOAD_RDY) {
 907                 /* Do we have any data packets from the host to send? */
 908                 packet = NULL;
 909                 spin_lock_irqsave(&card->buffer_lock, flags);
 910                 if (!list_empty(&card->data_packet_list)) {
 911                         packet = (struct if_spi_packet *)(card->
 912                                         data_packet_list.next);
 913                         list_del(&packet->list);
 914                 }
 915                 spin_unlock_irqrestore(&card->buffer_lock, flags);
 916 
 917                 if (packet)
 918                         if_spi_h2c(card, packet, MVMS_DAT);
 919         }
 920         if (hiStatus & IF_SPI_HIST_CARD_EVENT)
 921                 if_spi_e2h(card);
 922 
 923 err:
 924         if (err)
 925                 netdev_err(priv->dev, "%s: got error %d\n", __func__, err);
 926 }
 927 
 928 /*
 929  * Host to Card
 930  *
 931  * Called from Libertas to transfer some data to the WLAN device
 932  * We can't sleep here.
 933  */
 934 static int if_spi_host_to_card(struct lbs_private *priv,
 935                                 u8 type, u8 *buf, u16 nb)
 936 {
 937         int err = 0;
 938         unsigned long flags;
 939         struct if_spi_card *card = priv->card;
 940         struct if_spi_packet *packet;
 941         u16 blen;
 942 
 943         if (nb == 0) {
 944                 netdev_err(priv->dev, "%s: invalid size requested: %d\n",
 945                            __func__, nb);
 946                 err = -EINVAL;
 947                 goto out;
 948         }
 949         blen = ALIGN(nb, 4);
 950         packet = kzalloc(sizeof(struct if_spi_packet) + blen, GFP_ATOMIC);
 951         if (!packet) {
 952                 err = -ENOMEM;
 953                 goto out;
 954         }
 955         packet->blen = blen;
 956         memcpy(packet->buffer, buf, nb);
 957         memset(packet->buffer + nb, 0, blen - nb);
 958 
 959         switch (type) {
 960         case MVMS_CMD:
 961                 priv->dnld_sent = DNLD_CMD_SENT;
 962                 spin_lock_irqsave(&card->buffer_lock, flags);
 963                 list_add_tail(&packet->list, &card->cmd_packet_list);
 964                 spin_unlock_irqrestore(&card->buffer_lock, flags);
 965                 break;
 966         case MVMS_DAT:
 967                 priv->dnld_sent = DNLD_DATA_SENT;
 968                 spin_lock_irqsave(&card->buffer_lock, flags);
 969                 list_add_tail(&packet->list, &card->data_packet_list);
 970                 spin_unlock_irqrestore(&card->buffer_lock, flags);
 971                 break;
 972         default:
 973                 kfree(packet);
 974                 netdev_err(priv->dev, "can't transfer buffer of type %d\n",
 975                            type);
 976                 err = -EINVAL;
 977                 break;
 978         }
 979 
 980         /* Queue spi xfer work */
 981         queue_work(card->workqueue, &card->packet_work);
 982 out:
 983         return err;
 984 }
 985 
 986 /*
 987  * Host Interrupts
 988  *
 989  * Service incoming interrupts from the WLAN device. We can't sleep here, so
 990  * don't try to talk on the SPI bus, just queue the SPI xfer work.
 991  */
 992 static irqreturn_t if_spi_host_interrupt(int irq, void *dev_id)
 993 {
 994         struct if_spi_card *card = dev_id;
 995 
 996         queue_work(card->workqueue, &card->packet_work);
 997 
 998         return IRQ_HANDLED;
 999 }
1000 
1001 /*
1002  * SPI callbacks
1003  */
1004 
1005 static int if_spi_init_card(struct if_spi_card *card)
1006 {
1007         struct lbs_private *priv = card->priv;
1008         int err, i;
1009         u32 scratch;
1010         const struct firmware *helper = NULL;
1011         const struct firmware *mainfw = NULL;
1012 
1013         err = spu_init(card, card->pdata->use_dummy_writes);
1014         if (err)
1015                 goto out;
1016         err = spu_get_chip_revision(card, &card->card_id, &card->card_rev);
1017         if (err)
1018                 goto out;
1019 
1020         err = spu_read_u32(card, IF_SPI_SCRATCH_4_REG, &scratch);
1021         if (err)
1022                 goto out;
1023         if (scratch == SUCCESSFUL_FW_DOWNLOAD_MAGIC)
1024                 lbs_deb_spi("Firmware is already loaded for "
1025                             "Marvell WLAN 802.11 adapter\n");
1026         else {
1027                 /* Check if we support this card */
1028                 for (i = 0; i < ARRAY_SIZE(fw_table); i++) {
1029                         if (card->card_id == fw_table[i].model)
1030                                 break;
1031                 }
1032                 if (i == ARRAY_SIZE(fw_table)) {
1033                         netdev_err(priv->dev, "Unsupported chip_id: 0x%02x\n",
1034                                    card->card_id);
1035                         err = -ENODEV;
1036                         goto out;
1037                 }
1038 
1039                 err = lbs_get_firmware(&card->spi->dev, card->card_id,
1040                                         &fw_table[0], &helper, &mainfw);
1041                 if (err) {
1042                         netdev_err(priv->dev, "failed to find firmware (%d)\n",
1043                                    err);
1044                         goto out;
1045                 }
1046 
1047                 lbs_deb_spi("Initializing FW for Marvell WLAN 802.11 adapter "
1048                                 "(chip_id = 0x%04x, chip_rev = 0x%02x) "
1049                                 "attached to SPI bus_num %d, chip_select %d. "
1050                                 "spi->max_speed_hz=%d\n",
1051                                 card->card_id, card->card_rev,
1052                                 card->spi->master->bus_num,
1053                                 card->spi->chip_select,
1054                                 card->spi->max_speed_hz);
1055                 err = if_spi_prog_helper_firmware(card, helper);
1056                 if (err)
1057                         goto out;
1058                 err = if_spi_prog_main_firmware(card, mainfw);
1059                 if (err)
1060                         goto out;
1061                 lbs_deb_spi("loaded FW for Marvell WLAN 802.11 adapter\n");
1062         }
1063 
1064         err = spu_set_interrupt_mode(card, 0, 1);
1065         if (err)
1066                 goto out;
1067 
1068 out:
1069         return err;
1070 }
1071 
1072 static void if_spi_resume_worker(struct work_struct *work)
1073 {
1074         struct if_spi_card *card;
1075 
1076         card = container_of(work, struct if_spi_card, resume_work);
1077 
1078         if (card->suspended) {
1079                 if (card->pdata->setup)
1080                         card->pdata->setup(card->spi);
1081 
1082                 /* Init card ... */
1083                 if_spi_init_card(card);
1084 
1085                 enable_irq(card->spi->irq);
1086 
1087                 /* And resume it ... */
1088                 lbs_resume(card->priv);
1089 
1090                 card->suspended = 0;
1091         }
1092 }
1093 
1094 static int if_spi_probe(struct spi_device *spi)
1095 {
1096         struct if_spi_card *card;
1097         struct lbs_private *priv = NULL;
1098         struct libertas_spi_platform_data *pdata = dev_get_platdata(&spi->dev);
1099         int err = 0;
1100 
1101         if (!pdata) {
1102                 err = -EINVAL;
1103                 goto out;
1104         }
1105 
1106         if (pdata->setup) {
1107                 err = pdata->setup(spi);
1108                 if (err)
1109                         goto out;
1110         }
1111 
1112         /* Allocate card structure to represent this specific device */
1113         card = kzalloc(sizeof(struct if_spi_card), GFP_KERNEL);
1114         if (!card) {
1115                 err = -ENOMEM;
1116                 goto teardown;
1117         }
1118         spi_set_drvdata(spi, card);
1119         card->pdata = pdata;
1120         card->spi = spi;
1121         card->prev_xfer_time = jiffies;
1122 
1123         INIT_LIST_HEAD(&card->cmd_packet_list);
1124         INIT_LIST_HEAD(&card->data_packet_list);
1125         spin_lock_init(&card->buffer_lock);
1126 
1127         /* Initialize the SPI Interface Unit */
1128 
1129         /* Firmware load */
1130         err = if_spi_init_card(card);
1131         if (err)
1132                 goto free_card;
1133 
1134         /*
1135          * Register our card with libertas.
1136          * This will call alloc_etherdev.
1137          */
1138         priv = lbs_add_card(card, &spi->dev);
1139         if (IS_ERR(priv)) {
1140                 err = PTR_ERR(priv);
1141                 goto free_card;
1142         }
1143         card->priv = priv;
1144         priv->setup_fw_on_resume = 1;
1145         priv->card = card;
1146         priv->hw_host_to_card = if_spi_host_to_card;
1147         priv->enter_deep_sleep = NULL;
1148         priv->exit_deep_sleep = NULL;
1149         priv->reset_deep_sleep_wakeup = NULL;
1150         priv->fw_ready = 1;
1151 
1152         /* Initialize interrupt handling stuff. */
1153         card->workqueue = alloc_workqueue("libertas_spi", WQ_MEM_RECLAIM, 0);
1154         if (!card->workqueue) {
1155                 err = -ENOMEM;
1156                 goto remove_card;
1157         }
1158         INIT_WORK(&card->packet_work, if_spi_host_to_card_worker);
1159         INIT_WORK(&card->resume_work, if_spi_resume_worker);
1160 
1161         err = request_irq(spi->irq, if_spi_host_interrupt,
1162                         IRQF_TRIGGER_FALLING, "libertas_spi", card);
1163         if (err) {
1164                 pr_err("can't get host irq line-- request_irq failed\n");
1165                 goto terminate_workqueue;
1166         }
1167 
1168         /*
1169          * Start the card.
1170          * This will call register_netdev, and we'll start
1171          * getting interrupts...
1172          */
1173         err = lbs_start_card(priv);
1174         if (err)
1175                 goto release_irq;
1176 
1177         lbs_deb_spi("Finished initializing WLAN module.\n");
1178 
1179         /* successful exit */
1180         goto out;
1181 
1182 release_irq:
1183         free_irq(spi->irq, card);
1184 terminate_workqueue:
1185         destroy_workqueue(card->workqueue);
1186 remove_card:
1187         lbs_remove_card(priv); /* will call free_netdev */
1188 free_card:
1189         free_if_spi_card(card);
1190 teardown:
1191         if (pdata->teardown)
1192                 pdata->teardown(spi);
1193 out:
1194         return err;
1195 }
1196 
1197 static int libertas_spi_remove(struct spi_device *spi)
1198 {
1199         struct if_spi_card *card = spi_get_drvdata(spi);
1200         struct lbs_private *priv = card->priv;
1201 
1202         lbs_deb_spi("libertas_spi_remove\n");
1203 
1204         cancel_work_sync(&card->resume_work);
1205 
1206         lbs_stop_card(priv);
1207         lbs_remove_card(priv); /* will call free_netdev */
1208 
1209         free_irq(spi->irq, card);
1210         destroy_workqueue(card->workqueue);
1211         if (card->pdata->teardown)
1212                 card->pdata->teardown(spi);
1213         free_if_spi_card(card);
1214 
1215         return 0;
1216 }
1217 
1218 static int if_spi_suspend(struct device *dev)
1219 {
1220         struct spi_device *spi = to_spi_device(dev);
1221         struct if_spi_card *card = spi_get_drvdata(spi);
1222 
1223         if (!card->suspended) {
1224                 lbs_suspend(card->priv);
1225                 flush_workqueue(card->workqueue);
1226                 disable_irq(spi->irq);
1227 
1228                 if (card->pdata->teardown)
1229                         card->pdata->teardown(spi);
1230                 card->suspended = 1;
1231         }
1232 
1233         return 0;
1234 }
1235 
1236 static int if_spi_resume(struct device *dev)
1237 {
1238         struct spi_device *spi = to_spi_device(dev);
1239         struct if_spi_card *card = spi_get_drvdata(spi);
1240 
1241         /* Schedule delayed work */
1242         schedule_work(&card->resume_work);
1243 
1244         return 0;
1245 }
1246 
1247 static const struct dev_pm_ops if_spi_pm_ops = {
1248         .suspend        = if_spi_suspend,
1249         .resume         = if_spi_resume,
1250 };
1251 
1252 static struct spi_driver libertas_spi_driver = {
1253         .probe  = if_spi_probe,
1254         .remove = libertas_spi_remove,
1255         .driver = {
1256                 .name   = "libertas_spi",
1257                 .pm     = &if_spi_pm_ops,
1258         },
1259 };
1260 
1261 /*
1262  * Module functions
1263  */
1264 
1265 static int __init if_spi_init_module(void)
1266 {
1267         int ret = 0;
1268 
1269         printk(KERN_INFO "libertas_spi: Libertas SPI driver\n");
1270         ret = spi_register_driver(&libertas_spi_driver);
1271 
1272         return ret;
1273 }
1274 
1275 static void __exit if_spi_exit_module(void)
1276 {
1277         spi_unregister_driver(&libertas_spi_driver);
1278 }
1279 
1280 module_init(if_spi_init_module);
1281 module_exit(if_spi_exit_module);
1282 
1283 MODULE_DESCRIPTION("Libertas SPI WLAN Driver");
1284 MODULE_AUTHOR("Andrey Yurovsky <andrey@cozybit.com>, "
1285               "Colin McCabe <colin@cozybit.com>");
1286 MODULE_LICENSE("GPL");
1287 MODULE_ALIAS("spi:libertas_spi");

/* [<][>][^][v][top][bottom][index][help] */