i2400m.h revision c931ceeb780560ff652a8f9875f88778439ee87e
1/* 2 * Intel Wireless WiMAX Connection 2400m 3 * Declarations for bus-generic internal APIs 4 * 5 * 6 * Copyright (C) 2007-2008 Intel Corporation. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * * Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * * Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in 16 * the documentation and/or other materials provided with the 17 * distribution. 18 * * Neither the name of Intel Corporation nor the names of its 19 * contributors may be used to endorse or promote products derived 20 * from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 * 34 * 35 * Intel Corporation <linux-wimax@intel.com> 36 * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com> 37 * Yanir Lubetkin <yanirx.lubetkin@intel.com> 38 * - Initial implementation 39 * 40 * 41 * GENERAL DRIVER ARCHITECTURE 42 * 43 * The i2400m driver is split in the following two major parts: 44 * 45 * - bus specific driver 46 * - bus generic driver (this part) 47 * 48 * The bus specific driver sets up stuff specific to the bus the 49 * device is connected to (USB, SDIO, PCI, tam-tam...non-authoritative 50 * nor binding list) which is basically the device-model management 51 * (probe/disconnect, etc), moving data from device to kernel and 52 * back, doing the power saving details and reseting the device. 53 * 54 * For details on each bus-specific driver, see it's include file, 55 * i2400m-BUSNAME.h 56 * 57 * The bus-generic functionality break up is: 58 * 59 * - Firmware upload: fw.c - takes care of uploading firmware to the 60 * device. bus-specific driver just needs to provides a way to 61 * execute boot-mode commands and to reset the device. 62 * 63 * - RX handling: rx.c - receives data from the bus-specific code and 64 * feeds it to the network or WiMAX stack or uses it to modify 65 * the driver state. bus-specific driver only has to receive 66 * frames and pass them to this module. 67 * 68 * - TX handling: tx.c - manages the TX FIFO queue and provides means 69 * for the bus-specific TX code to pull data from the FIFO 70 * queue. bus-specific code just pulls frames from this module 71 * to sends them to the device. 72 * 73 * - netdev glue: netdev.c - interface with Linux networking 74 * stack. Pass around data frames, and configure when the 75 * device is up and running or shutdown (through ifconfig up / 76 * down). Bus-generic only. 77 * 78 * - control ops: control.c - implements various commmands for 79 * controlling the device. bus-generic only. 80 * 81 * - device model glue: driver.c - implements helpers for the 82 * device-model glue done by the bus-specific layer 83 * (setup/release the driver resources), turning the device on 84 * and off, handling the device reboots/resets and a few simple 85 * WiMAX stack ops. 86 * 87 * Code is also broken up in linux-glue / device-glue. 88 * 89 * Linux glue contains functions that deal mostly with gluing with the 90 * rest of the Linux kernel. 91 * 92 * Device-glue are functions that deal mostly with the way the device 93 * does things and talk the device's language. 94 * 95 * device-glue code is licensed BSD so other open source OSes can take 96 * it to implement their drivers. 97 * 98 * 99 * APIs AND HEADER FILES 100 * 101 * This bus generic code exports three APIs: 102 * 103 * - HDI (host-device interface) definitions common to all busses 104 * (include/linux/wimax/i2400m.h); these can be also used by user 105 * space code. 106 * - internal API for the bus-generic code 107 * - external API for the bus-specific drivers 108 * 109 * 110 * LIFE CYCLE: 111 * 112 * When the bus-specific driver probes, it allocates a network device 113 * with enough space for it's data structue, that must contain a 114 * &struct i2400m at the top. 115 * 116 * On probe, it needs to fill the i2400m members marked as [fill], as 117 * well as i2400m->wimax_dev.net_dev and call i2400m_setup(). The 118 * i2400m driver will only register with the WiMAX and network stacks; 119 * the only access done to the device is to read the MAC address so we 120 * can register a network device. 121 * 122 * The high-level call flow is: 123 * 124 * bus_probe() 125 * i2400m_setup() 126 * i2400m->bus_setup() 127 * boot rom initialization / read mac addr 128 * network / WiMAX stacks registration 129 * i2400m_dev_start() 130 * i2400m->bus_dev_start() 131 * i2400m_dev_initialize() 132 * 133 * The reverse applies for a disconnect() call: 134 * 135 * bus_disconnect() 136 * i2400m_release() 137 * i2400m_dev_stop() 138 * i2400m_dev_shutdown() 139 * i2400m->bus_dev_stop() 140 * network / WiMAX stack unregistration 141 * i2400m->bus_release() 142 * 143 * At this point, control and data communications are possible. 144 * 145 * While the device is up, it might reset. The bus-specific driver has 146 * to catch that situation and call i2400m_dev_reset_handle() to deal 147 * with it (reset the internal driver structures and go back to square 148 * one). 149 */ 150 151#ifndef __I2400M_H__ 152#define __I2400M_H__ 153 154#include <linux/usb.h> 155#include <linux/netdevice.h> 156#include <linux/completion.h> 157#include <linux/rwsem.h> 158#include <asm/atomic.h> 159#include <net/wimax.h> 160#include <linux/wimax/i2400m.h> 161#include <asm/byteorder.h> 162 163/* Misc constants */ 164enum { 165 /* Size of the Boot Mode Command buffer */ 166 I2400M_BM_CMD_BUF_SIZE = 16 * 1024, 167 I2400M_BM_ACK_BUF_SIZE = 256, 168}; 169 170/** 171 * struct i2400m_poke_table - Hardware poke table for the Intel 2400m 172 * 173 * This structure will be used to create a device specific poke table 174 * to put the device in a consistant state at boot time. 175 * 176 * @address: The device address to poke 177 * 178 * @data: The data value to poke to the device address 179 * 180 */ 181struct i2400m_poke_table{ 182 __le32 address; 183 __le32 data; 184}; 185 186#define I2400M_FW_POKE(a, d) { \ 187 .address = cpu_to_le32(a), \ 188 .data = cpu_to_le32(d) \ 189} 190 191 192/** 193 * i2400m_reset_type - methods to reset a device 194 * 195 * @I2400M_RT_WARM: Reset without device disconnection, device handles 196 * are kept valid but state is back to power on, with firmware 197 * re-uploaded. 198 * @I2400M_RT_COLD: Tell the device to disconnect itself from the bus 199 * and reconnect. Renders all device handles invalid. 200 * @I2400M_RT_BUS: Tells the bus to reset the device; last measure 201 * used when both types above don't work. 202 */ 203enum i2400m_reset_type { 204 I2400M_RT_WARM, /* first measure */ 205 I2400M_RT_COLD, /* second measure */ 206 I2400M_RT_BUS, /* call in artillery */ 207}; 208 209struct i2400m_reset_ctx; 210struct i2400m_roq; 211struct i2400m_barker_db; 212 213/** 214 * struct i2400m - descriptor for an Intel 2400m 215 * 216 * Members marked with [fill] must be filled out/initialized before 217 * calling i2400m_setup(). 218 * 219 * Note the @bus_setup/@bus_release, @bus_dev_start/@bus_dev_release 220 * call pairs are very much doing almost the same, and depending on 221 * the underlying bus, some stuff has to be put in one or the 222 * other. The idea of setup/release is that they setup the minimal 223 * amount needed for loading firmware, where us dev_start/stop setup 224 * the rest needed to do full data/control traffic. 225 * 226 * @bus_tx_block_size: [fill] SDIO imposes a 256 block size, USB 16, 227 * so we have a tx_blk_size variable that the bus layer sets to 228 * tell the engine how much of that we need. 229 * 230 * @bus_pl_size_max: [fill] Maximum payload size. 231 * 232 * @bus_setup: [optional fill] Function called by the bus-generic code 233 * [i2400m_setup()] to setup the basic bus-specific communications 234 * to the the device needed to load firmware. See LIFE CYCLE above. 235 * 236 * NOTE: Doesn't need to upload the firmware, as that is taken 237 * care of by the bus-generic code. 238 * 239 * @bus_release: [optional fill] Function called by the bus-generic 240 * code [i2400m_release()] to shutdown the basic bus-specific 241 * communications to the the device needed to load firmware. See 242 * LIFE CYCLE above. 243 * 244 * This function does not need to reset the device, just tear down 245 * all the host resources created to handle communication with 246 * the device. 247 * 248 * @bus_dev_start: [optional fill] Function called by the bus-generic 249 * code [i2400m_dev_start()] to do things needed to start the 250 * device. See LIFE CYCLE above. 251 * 252 * NOTE: Doesn't need to upload the firmware, as that is taken 253 * care of by the bus-generic code. 254 * 255 * @bus_dev_stop: [optional fill] Function called by the bus-generic 256 * code [i2400m_dev_stop()] to do things needed for stopping the 257 * device. See LIFE CYCLE above. 258 * 259 * This function does not need to reset the device, just tear down 260 * all the host resources created to handle communication with 261 * the device. 262 * 263 * @bus_tx_kick: [fill] Function called by the bus-generic code to let 264 * the bus-specific code know that there is data available in the 265 * TX FIFO for transmission to the device. 266 * 267 * This function cannot sleep. 268 * 269 * @bus_reset: [fill] Function called by the bus-generic code to reset 270 * the device in in various ways. Doesn't need to wait for the 271 * reset to finish. 272 * 273 * If warm or cold reset fail, this function is expected to do a 274 * bus-specific reset (eg: USB reset) to get the device to a 275 * working state (even if it implies device disconecction). 276 * 277 * Note the warm reset is used by the firmware uploader to 278 * reinitialize the device. 279 * 280 * IMPORTANT: this is called very early in the device setup 281 * process, so it cannot rely on common infrastructure being laid 282 * out. 283 * 284 * IMPORTANT: don't call reset on RT_BUS with i2400m->init_mutex 285 * held, as the .pre/.post reset handlers will deadlock. 286 * 287 * @bus_bm_retries: [fill] How many times shall a firmware upload / 288 * device initialization be retried? Different models of the same 289 * device might need different values, hence it is set by the 290 * bus-specific driver. Note this value is used in two places, 291 * i2400m_fw_dnload() and __i2400m_dev_start(); they won't become 292 * multiplicative (__i2400m_dev_start() calling N times 293 * i2400m_fw_dnload() and this trying N times to download the 294 * firmware), as if __i2400m_dev_start() only retries if the 295 * firmware crashed while initializing the device (not in a 296 * general case). 297 * 298 * @bus_bm_cmd_send: [fill] Function called to send a boot-mode 299 * command. Flags are defined in 'enum i2400m_bm_cmd_flags'. This 300 * is synchronous and has to return 0 if ok or < 0 errno code in 301 * any error condition. 302 * 303 * @bus_bm_wait_for_ack: [fill] Function called to wait for a 304 * boot-mode notification (that can be a response to a previously 305 * issued command or an asynchronous one). Will read until all the 306 * indicated size is read or timeout. Reading more or less data 307 * than asked for is an error condition. Return 0 if ok, < 0 errno 308 * code on error. 309 * 310 * The caller to this function will check if the response is a 311 * barker that indicates the device going into reset mode. 312 * 313 * @bus_fw_names: [fill] a NULL-terminated array with the names of the 314 * firmware images to try loading. This is made a list so we can 315 * support backward compatibility of firmware releases (eg: if we 316 * can't find the default v1.4, we try v1.3). In general, the name 317 * should be i2400m-fw-X-VERSION.sbcf, where X is the bus name. 318 * The list is tried in order and the first one that loads is 319 * used. The fw loader will set i2400m->fw_name to point to the 320 * active firmware image. 321 * 322 * @bus_bm_mac_addr_impaired: [fill] Set to true if the device's MAC 323 * address provided in boot mode is kind of broken and needs to 324 * be re-read later on. 325 * 326 * @bus_bm_pokes_table: [fill/optional] A table of device addresses 327 * and values that will be poked at device init time to move the 328 * device to the correct state for the type of boot/firmware being 329 * used. This table MUST be terminated with (0x000000, 330 * 0x00000000) or bad things will happen. 331 * 332 * 333 * @wimax_dev: WiMAX generic device for linkage into the kernel WiMAX 334 * stack. Due to the way a net_device is allocated, we need to 335 * force this to be the first field so that we can get from 336 * netdev_priv() the right pointer. 337 * 338 * @updown: the device is up and ready for transmitting control and 339 * data packets. This implies @ready (communication infrastructure 340 * with the device is ready) and the device's firmware has been 341 * loaded and the device initialized. 342 * 343 * Write to it only inside a i2400m->init_mutex protected area 344 * followed with a wmb(); rmb() before accesing (unless locked 345 * inside i2400m->init_mutex). Read access can be loose like that 346 * [just using rmb()] because the paths that use this also do 347 * other error checks later on. 348 * 349 * @ready: Communication infrastructure with the device is ready, data 350 * frames can start to be passed around (this is lighter than 351 * using the WiMAX state for certain hot paths). 352 * 353 * Write to it only inside a i2400m->init_mutex protected area 354 * followed with a wmb(); rmb() before accesing (unless locked 355 * inside i2400m->init_mutex). Read access can be loose like that 356 * [just using rmb()] because the paths that use this also do 357 * other error checks later on. 358 * 359 * @rx_reorder: 1 if RX reordering is enabled; this can only be 360 * set at probe time. 361 * 362 * @state: device's state (as reported by it) 363 * 364 * @state_wq: waitqueue that is woken up whenever the state changes 365 * 366 * @tx_lock: spinlock to protect TX members 367 * 368 * @tx_buf: FIFO buffer for TX; we queue data here 369 * 370 * @tx_in: FIFO index for incoming data. Note this doesn't wrap around 371 * and it is always greater than @tx_out. 372 * 373 * @tx_out: FIFO index for outgoing data 374 * 375 * @tx_msg: current TX message that is active in the FIFO for 376 * appending payloads. 377 * 378 * @tx_sequence: current sequence number for TX messages from the 379 * device to the host. 380 * 381 * @tx_msg_size: size of the current message being transmitted by the 382 * bus-specific code. 383 * 384 * @tx_pl_num: total number of payloads sent 385 * 386 * @tx_pl_max: maximum number of payloads sent in a TX message 387 * 388 * @tx_pl_min: minimum number of payloads sent in a TX message 389 * 390 * @tx_num: number of TX messages sent 391 * 392 * @tx_size_acc: number of bytes in all TX messages sent 393 * (this is different to net_dev's statistics as it also counts 394 * control messages). 395 * 396 * @tx_size_min: smallest TX message sent. 397 * 398 * @tx_size_max: biggest TX message sent. 399 * 400 * @rx_lock: spinlock to protect RX members 401 * 402 * @rx_pl_num: total number of payloads received 403 * 404 * @rx_pl_max: maximum number of payloads received in a RX message 405 * 406 * @rx_pl_min: minimum number of payloads received in a RX message 407 * 408 * @rx_num: number of RX messages received 409 * 410 * @rx_size_acc: number of bytes in all RX messages received 411 * (this is different to net_dev's statistics as it also counts 412 * control messages). 413 * 414 * @rx_size_min: smallest RX message received. 415 * 416 * @rx_size_max: buggest RX message received. 417 * 418 * @rx_roq: RX ReOrder queues. (fw >= v1.4) When packets are received 419 * out of order, the device will ask the driver to hold certain 420 * packets until the ones that are received out of order can be 421 * delivered. Then the driver can release them to the host. See 422 * drivers/net/i2400m/rx.c for details. 423 * 424 * @rx_reports: reports received from the device that couldn't be 425 * processed because the driver wasn't still ready; when ready, 426 * they are pulled from here and chewed. 427 * 428 * @rx_reports_ws: Work struct used to kick a scan of the RX reports 429 * list and to process each. 430 * 431 * @src_mac_addr: MAC address used to make ethernet packets be coming 432 * from. This is generated at i2400m_setup() time and used during 433 * the life cycle of the instance. See i2400m_fake_eth_header(). 434 * 435 * @init_mutex: Mutex used for serializing the device bringup 436 * sequence; this way if the device reboots in the middle, we 437 * don't try to do a bringup again while we are tearing down the 438 * one that failed. 439 * 440 * Can't reuse @msg_mutex because from within the bringup sequence 441 * we need to send messages to the device and thus use @msg_mutex. 442 * 443 * @msg_mutex: mutex used to send control commands to the device (we 444 * only allow one at a time, per host-device interface design). 445 * 446 * @msg_completion: used to wait for an ack to a control command sent 447 * to the device. 448 * 449 * @ack_skb: used to store the actual ack to a control command if the 450 * reception of the command was successful. Otherwise, a ERR_PTR() 451 * errno code that indicates what failed with the ack reception. 452 * 453 * Only valid after @msg_completion is woken up. Only updateable 454 * if @msg_completion is armed. Only touched by 455 * i2400m_msg_to_dev(). 456 * 457 * Protected by @rx_lock. In theory the command execution flow is 458 * sequential, but in case the device sends an out-of-phase or 459 * very delayed response, we need to avoid it trampling current 460 * execution. 461 * 462 * @bm_cmd_buf: boot mode command buffer for composing firmware upload 463 * commands. 464 * 465 * USB can't r/w to stack, vmalloc, etc...as well, we end up 466 * having to alloc/free a lot to compose commands, so we use these 467 * for stagging and not having to realloc all the time. 468 * 469 * This assumes the code always runs serialized. Only one thread 470 * can call i2400m_bm_cmd() at the same time. 471 * 472 * @bm_ack_buf: boot mode acknoledge buffer for staging reception of 473 * responses to commands. 474 * 475 * See @bm_cmd_buf. 476 * 477 * @work_queue: work queue for processing device reports. This 478 * workqueue cannot be used for processing TX or RX to the device, 479 * as from it we'll process device reports, which might require 480 * further communication with the device. 481 * 482 * @debugfs_dentry: hookup for debugfs files. 483 * These have to be in a separate directory, a child of 484 * (wimax_dev->debugfs_dentry) so they can be removed when the 485 * module unloads, as we don't keep each dentry. 486 * 487 * @fw_name: name of the firmware image that is currently being used. 488 * 489 * @fw_version: version of the firmware interface, Major.minor, 490 * encoded in the high word and low word (major << 16 | minor). 491 * 492 * @fw_hdrs: NULL terminated array of pointers to the firmware 493 * headers. This is only available during firmware load time. 494 * 495 * @fw_cached: Used to cache firmware when the system goes to 496 * suspend/standby/hibernation (as on resume we can't read it). If 497 * NULL, no firmware was cached, read it. If ~0, you can't read 498 * any firmware files (the system still didn't come out of suspend 499 * and failed to cache one), so abort; otherwise, a valid cached 500 * firmware to be used. Access to this variable is protected by 501 * the spinlock i2400m->rx_lock. 502 * 503 * @barker: barker type that the device uses; this is initialized by 504 * i2400m_is_boot_barker() the first time it is called. Then it 505 * won't change during the life cycle of the device and everytime 506 * a boot barker is received, it is just verified for it being the 507 * same. 508 * 509 * @pm_notifier: used to register for PM events 510 */ 511struct i2400m { 512 struct wimax_dev wimax_dev; /* FIRST! See doc */ 513 514 unsigned updown:1; /* Network device is up or down */ 515 unsigned boot_mode:1; /* is the device in boot mode? */ 516 unsigned sboot:1; /* signed or unsigned fw boot */ 517 unsigned ready:1; /* Device comm infrastructure ready */ 518 unsigned rx_reorder:1; /* RX reorder is enabled */ 519 u8 trace_msg_from_user; /* echo rx msgs to 'trace' pipe */ 520 /* typed u8 so /sys/kernel/debug/u8 can tweak */ 521 enum i2400m_system_state state; 522 wait_queue_head_t state_wq; /* Woken up when on state updates */ 523 524 size_t bus_tx_block_size; 525 size_t bus_pl_size_max; 526 unsigned bus_bm_retries; 527 528 int (*bus_setup)(struct i2400m *); 529 int (*bus_dev_start)(struct i2400m *); 530 void (*bus_dev_stop)(struct i2400m *); 531 void (*bus_release)(struct i2400m *); 532 void (*bus_tx_kick)(struct i2400m *); 533 int (*bus_reset)(struct i2400m *, enum i2400m_reset_type); 534 ssize_t (*bus_bm_cmd_send)(struct i2400m *, 535 const struct i2400m_bootrom_header *, 536 size_t, int flags); 537 ssize_t (*bus_bm_wait_for_ack)(struct i2400m *, 538 struct i2400m_bootrom_header *, size_t); 539 const char **bus_fw_names; 540 unsigned bus_bm_mac_addr_impaired:1; 541 const struct i2400m_poke_table *bus_bm_pokes_table; 542 543 spinlock_t tx_lock; /* protect TX state */ 544 void *tx_buf; 545 size_t tx_in, tx_out; 546 struct i2400m_msg_hdr *tx_msg; 547 size_t tx_sequence, tx_msg_size; 548 /* TX stats */ 549 unsigned tx_pl_num, tx_pl_max, tx_pl_min, 550 tx_num, tx_size_acc, tx_size_min, tx_size_max; 551 552 /* RX stuff */ 553 spinlock_t rx_lock; /* protect RX state */ 554 unsigned rx_pl_num, rx_pl_max, rx_pl_min, 555 rx_num, rx_size_acc, rx_size_min, rx_size_max; 556 struct i2400m_roq *rx_roq; /* not under rx_lock! */ 557 u8 src_mac_addr[ETH_HLEN]; 558 struct list_head rx_reports; /* under rx_lock! */ 559 struct work_struct rx_report_ws; 560 561 struct mutex msg_mutex; /* serialize command execution */ 562 struct completion msg_completion; 563 struct sk_buff *ack_skb; /* protected by rx_lock */ 564 565 void *bm_ack_buf; /* for receiving acks over USB */ 566 void *bm_cmd_buf; /* for issuing commands over USB */ 567 568 struct workqueue_struct *work_queue; 569 570 struct mutex init_mutex; /* protect bringup seq */ 571 struct i2400m_reset_ctx *reset_ctx; /* protected by init_mutex */ 572 573 struct work_struct wake_tx_ws; 574 struct sk_buff *wake_tx_skb; 575 576 struct dentry *debugfs_dentry; 577 const char *fw_name; /* name of the current firmware image */ 578 unsigned long fw_version; /* version of the firmware interface */ 579 const struct i2400m_bcf_hdr **fw_hdrs; 580 struct i2400m_fw *fw_cached; /* protected by rx_lock */ 581 struct i2400m_barker_db *barker; 582 583 struct notifier_block pm_notifier; 584}; 585 586 587/* 588 * Bus-generic internal APIs 589 * ------------------------- 590 */ 591 592static inline 593struct i2400m *wimax_dev_to_i2400m(struct wimax_dev *wimax_dev) 594{ 595 return container_of(wimax_dev, struct i2400m, wimax_dev); 596} 597 598static inline 599struct i2400m *net_dev_to_i2400m(struct net_device *net_dev) 600{ 601 return wimax_dev_to_i2400m(netdev_priv(net_dev)); 602} 603 604/* 605 * Boot mode support 606 */ 607 608/** 609 * i2400m_bm_cmd_flags - flags to i2400m_bm_cmd() 610 * 611 * @I2400M_BM_CMD_RAW: send the command block as-is, without doing any 612 * extra processing for adding CRC. 613 */ 614enum i2400m_bm_cmd_flags { 615 I2400M_BM_CMD_RAW = 1 << 2, 616}; 617 618/** 619 * i2400m_bri - Boot-ROM indicators 620 * 621 * Flags for i2400m_bootrom_init() and i2400m_dev_bootstrap() [which 622 * are passed from things like i2400m_setup()]. Can be combined with 623 * |. 624 * 625 * @I2400M_BRI_SOFT: The device rebooted already and a reboot 626 * barker received, proceed directly to ack the boot sequence. 627 * @I2400M_BRI_NO_REBOOT: Do not reboot the device and proceed 628 * directly to wait for a reboot barker from the device. 629 * @I2400M_BRI_MAC_REINIT: We need to reinitialize the boot 630 * rom after reading the MAC adress. This is quite a dirty hack, 631 * if you ask me -- the device requires the bootrom to be 632 * intialized after reading the MAC address. 633 */ 634enum i2400m_bri { 635 I2400M_BRI_SOFT = 1 << 1, 636 I2400M_BRI_NO_REBOOT = 1 << 2, 637 I2400M_BRI_MAC_REINIT = 1 << 3, 638}; 639 640extern void i2400m_bm_cmd_prepare(struct i2400m_bootrom_header *); 641extern int i2400m_dev_bootstrap(struct i2400m *, enum i2400m_bri); 642extern int i2400m_read_mac_addr(struct i2400m *); 643extern int i2400m_bootrom_init(struct i2400m *, enum i2400m_bri); 644extern int i2400m_is_boot_barker(struct i2400m *, const void *, size_t); 645static inline 646int i2400m_is_d2h_barker(const void *buf) 647{ 648 const __le32 *barker = buf; 649 return le32_to_cpu(*barker) == I2400M_D2H_MSG_BARKER; 650} 651extern void i2400m_unknown_barker(struct i2400m *, const void *, size_t); 652 653/* Make/grok boot-rom header commands */ 654 655static inline 656__le32 i2400m_brh_command(enum i2400m_brh_opcode opcode, unsigned use_checksum, 657 unsigned direct_access) 658{ 659 return cpu_to_le32( 660 I2400M_BRH_SIGNATURE 661 | (direct_access ? I2400M_BRH_DIRECT_ACCESS : 0) 662 | I2400M_BRH_RESPONSE_REQUIRED /* response always required */ 663 | (use_checksum ? I2400M_BRH_USE_CHECKSUM : 0) 664 | (opcode & I2400M_BRH_OPCODE_MASK)); 665} 666 667static inline 668void i2400m_brh_set_opcode(struct i2400m_bootrom_header *hdr, 669 enum i2400m_brh_opcode opcode) 670{ 671 hdr->command = cpu_to_le32( 672 (le32_to_cpu(hdr->command) & ~I2400M_BRH_OPCODE_MASK) 673 | (opcode & I2400M_BRH_OPCODE_MASK)); 674} 675 676static inline 677unsigned i2400m_brh_get_opcode(const struct i2400m_bootrom_header *hdr) 678{ 679 return le32_to_cpu(hdr->command) & I2400M_BRH_OPCODE_MASK; 680} 681 682static inline 683unsigned i2400m_brh_get_response(const struct i2400m_bootrom_header *hdr) 684{ 685 return (le32_to_cpu(hdr->command) & I2400M_BRH_RESPONSE_MASK) 686 >> I2400M_BRH_RESPONSE_SHIFT; 687} 688 689static inline 690unsigned i2400m_brh_get_use_checksum(const struct i2400m_bootrom_header *hdr) 691{ 692 return le32_to_cpu(hdr->command) & I2400M_BRH_USE_CHECKSUM; 693} 694 695static inline 696unsigned i2400m_brh_get_response_required( 697 const struct i2400m_bootrom_header *hdr) 698{ 699 return le32_to_cpu(hdr->command) & I2400M_BRH_RESPONSE_REQUIRED; 700} 701 702static inline 703unsigned i2400m_brh_get_direct_access(const struct i2400m_bootrom_header *hdr) 704{ 705 return le32_to_cpu(hdr->command) & I2400M_BRH_DIRECT_ACCESS; 706} 707 708static inline 709unsigned i2400m_brh_get_signature(const struct i2400m_bootrom_header *hdr) 710{ 711 return (le32_to_cpu(hdr->command) & I2400M_BRH_SIGNATURE_MASK) 712 >> I2400M_BRH_SIGNATURE_SHIFT; 713} 714 715 716/* 717 * Driver / device setup and internal functions 718 */ 719extern void i2400m_init(struct i2400m *); 720extern int i2400m_reset(struct i2400m *, enum i2400m_reset_type); 721extern void i2400m_netdev_setup(struct net_device *net_dev); 722extern int i2400m_sysfs_setup(struct device_driver *); 723extern void i2400m_sysfs_release(struct device_driver *); 724extern int i2400m_tx_setup(struct i2400m *); 725extern void i2400m_wake_tx_work(struct work_struct *); 726extern void i2400m_tx_release(struct i2400m *); 727 728extern int i2400m_rx_setup(struct i2400m *); 729extern void i2400m_rx_release(struct i2400m *); 730 731extern void i2400m_fw_cache(struct i2400m *); 732extern void i2400m_fw_uncache(struct i2400m *); 733 734extern void i2400m_net_rx(struct i2400m *, struct sk_buff *, unsigned, 735 const void *, int); 736extern void i2400m_net_erx(struct i2400m *, struct sk_buff *, 737 enum i2400m_cs); 738extern void i2400m_net_wake_stop(struct i2400m *); 739enum i2400m_pt; 740extern int i2400m_tx(struct i2400m *, const void *, size_t, enum i2400m_pt); 741 742#ifdef CONFIG_DEBUG_FS 743extern int i2400m_debugfs_add(struct i2400m *); 744extern void i2400m_debugfs_rm(struct i2400m *); 745#else 746static inline int i2400m_debugfs_add(struct i2400m *i2400m) 747{ 748 return 0; 749} 750static inline void i2400m_debugfs_rm(struct i2400m *i2400m) {} 751#endif 752 753/* Initialize/shutdown the device */ 754extern int i2400m_dev_initialize(struct i2400m *); 755extern void i2400m_dev_shutdown(struct i2400m *); 756 757extern struct attribute_group i2400m_dev_attr_group; 758 759 760/* HDI message's payload description handling */ 761 762static inline 763size_t i2400m_pld_size(const struct i2400m_pld *pld) 764{ 765 return I2400M_PLD_SIZE_MASK & le32_to_cpu(pld->val); 766} 767 768static inline 769enum i2400m_pt i2400m_pld_type(const struct i2400m_pld *pld) 770{ 771 return (I2400M_PLD_TYPE_MASK & le32_to_cpu(pld->val)) 772 >> I2400M_PLD_TYPE_SHIFT; 773} 774 775static inline 776void i2400m_pld_set(struct i2400m_pld *pld, size_t size, 777 enum i2400m_pt type) 778{ 779 pld->val = cpu_to_le32( 780 ((type << I2400M_PLD_TYPE_SHIFT) & I2400M_PLD_TYPE_MASK) 781 | (size & I2400M_PLD_SIZE_MASK)); 782} 783 784 785/* 786 * API for the bus-specific drivers 787 * -------------------------------- 788 */ 789 790static inline 791struct i2400m *i2400m_get(struct i2400m *i2400m) 792{ 793 dev_hold(i2400m->wimax_dev.net_dev); 794 return i2400m; 795} 796 797static inline 798void i2400m_put(struct i2400m *i2400m) 799{ 800 dev_put(i2400m->wimax_dev.net_dev); 801} 802 803extern int i2400m_dev_reset_handle(struct i2400m *, const char *); 804extern int i2400m_pre_reset(struct i2400m *); 805extern int i2400m_post_reset(struct i2400m *); 806 807/* 808 * _setup()/_release() are called by the probe/disconnect functions of 809 * the bus-specific drivers. 810 */ 811extern int i2400m_setup(struct i2400m *, enum i2400m_bri bm_flags); 812extern void i2400m_release(struct i2400m *); 813 814extern int i2400m_rx(struct i2400m *, struct sk_buff *); 815extern struct i2400m_msg_hdr *i2400m_tx_msg_get(struct i2400m *, size_t *); 816extern void i2400m_tx_msg_sent(struct i2400m *); 817 818extern int i2400m_power_save_disabled; 819 820/* 821 * Utility functions 822 */ 823 824static inline 825struct device *i2400m_dev(struct i2400m *i2400m) 826{ 827 return i2400m->wimax_dev.net_dev->dev.parent; 828} 829 830/* 831 * Helper for scheduling simple work functions 832 * 833 * This struct can get any kind of payload attached (normally in the 834 * form of a struct where you pack the stuff you want to pass to the 835 * _work function). 836 */ 837struct i2400m_work { 838 struct work_struct ws; 839 struct i2400m *i2400m; 840 size_t pl_size; 841 u8 pl[0]; 842}; 843 844extern int i2400m_schedule_work(struct i2400m *, 845 void (*)(struct work_struct *), gfp_t, 846 const void *, size_t); 847 848extern int i2400m_msg_check_status(const struct i2400m_l3l4_hdr *, 849 char *, size_t); 850extern int i2400m_msg_size_check(struct i2400m *, 851 const struct i2400m_l3l4_hdr *, size_t); 852extern struct sk_buff *i2400m_msg_to_dev(struct i2400m *, const void *, size_t); 853extern void i2400m_msg_to_dev_cancel_wait(struct i2400m *, int); 854extern void i2400m_msg_ack_hook(struct i2400m *, 855 const struct i2400m_l3l4_hdr *, size_t); 856extern void i2400m_report_hook(struct i2400m *, 857 const struct i2400m_l3l4_hdr *, size_t); 858extern void i2400m_report_hook_work(struct work_struct *); 859extern int i2400m_cmd_enter_powersave(struct i2400m *); 860extern int i2400m_cmd_get_state(struct i2400m *); 861extern int i2400m_cmd_exit_idle(struct i2400m *); 862extern struct sk_buff *i2400m_get_device_info(struct i2400m *); 863extern int i2400m_firmware_check(struct i2400m *); 864extern int i2400m_set_init_config(struct i2400m *, 865 const struct i2400m_tlv_hdr **, size_t); 866extern int i2400m_set_idle_timeout(struct i2400m *, unsigned); 867 868static inline 869struct usb_endpoint_descriptor *usb_get_epd(struct usb_interface *iface, int ep) 870{ 871 return &iface->cur_altsetting->endpoint[ep].desc; 872} 873 874extern int i2400m_op_rfkill_sw_toggle(struct wimax_dev *, 875 enum wimax_rf_state); 876extern void i2400m_report_tlv_rf_switches_status( 877 struct i2400m *, const struct i2400m_tlv_rf_switches_status *); 878 879/* 880 * Helpers for firmware backwards compability 881 * 882 * As we aim to support at least the firmware version that was 883 * released with the previous kernel/driver release, some code will be 884 * conditionally executed depending on the firmware version. On each 885 * release, the code to support fw releases past the last two ones 886 * will be purged. 887 * 888 * By making it depend on this macros, it is easier to keep it a tab 889 * on what has to go and what not. 890 */ 891static inline 892unsigned i2400m_le_v1_3(struct i2400m *i2400m) 893{ 894 /* running fw is lower or v1.3 */ 895 return i2400m->fw_version <= 0x00090001; 896} 897 898static inline 899unsigned i2400m_ge_v1_4(struct i2400m *i2400m) 900{ 901 /* running fw is higher or v1.4 */ 902 return i2400m->fw_version >= 0x00090002; 903} 904 905 906/* 907 * Do a millisecond-sleep for allowing wireshark to dump all the data 908 * packets. Used only for debugging. 909 */ 910static inline 911void __i2400m_msleep(unsigned ms) 912{ 913#if 1 914#else 915 msleep(ms); 916#endif 917} 918 919 920/* module initialization helpers */ 921extern int i2400m_barker_db_init(const char *); 922extern void i2400m_barker_db_exit(void); 923 924 925/* Module parameters */ 926 927extern int i2400m_idle_mode_disabled; 928extern int i2400m_rx_reorder_disabled; 929 930 931#endif /* #ifndef __I2400M_H__ */ 932