| Inaky Perez-Gonzalez | 3e91029 | 2008-12-20 16:57:42 -0800 | [diff] [blame] | 1 |  | 
|  | 2 | Driver for the Intel Wireless Wimax Connection 2400m | 
|  | 3 |  | 
|  | 4 | (C) 2008 Intel Corporation < linux-wimax@intel.com > | 
|  | 5 |  | 
|  | 6 | This provides a driver for the Intel Wireless WiMAX Connection 2400m | 
|  | 7 | and a basic Linux kernel WiMAX stack. | 
|  | 8 |  | 
|  | 9 | 1. Requirements | 
|  | 10 |  | 
|  | 11 | * Linux installation with Linux kernel 2.6.22 or newer (if building | 
|  | 12 | from a separate tree) | 
|  | 13 | * Intel i2400m Echo Peak or Baxter Peak; this includes the Intel | 
|  | 14 | Wireless WiMAX/WiFi Link 5x50 series. | 
|  | 15 | * build tools: | 
|  | 16 | + Linux kernel development package for the target kernel; to | 
|  | 17 | build against your currently running kernel, you need to have | 
|  | 18 | the kernel development package corresponding to the running | 
|  | 19 | image installed (usually if your kernel is named | 
|  | 20 | linux-VERSION, the development package is called | 
|  | 21 | linux-dev-VERSION or linux-headers-VERSION). | 
|  | 22 | + GNU C Compiler, make | 
|  | 23 |  | 
|  | 24 | 2. Compilation and installation | 
|  | 25 |  | 
|  | 26 | 2.1. Compilation of the drivers included in the kernel | 
|  | 27 |  | 
|  | 28 | Configure the kernel; to enable the WiMAX drivers select Drivers > | 
|  | 29 | Networking Drivers > WiMAX device support. Enable all of them as | 
|  | 30 | modules (easier). | 
|  | 31 |  | 
|  | 32 | If USB or SDIO are not enabled in the kernel configuration, the options | 
|  | 33 | to build the i2400m USB or SDIO drivers will not show. Enable said | 
|  | 34 | subsystems and go back to the WiMAX menu to enable the drivers. | 
|  | 35 |  | 
|  | 36 | Compile and install your kernel as usual. | 
|  | 37 |  | 
|  | 38 | 2.2. Compilation of the drivers distributed as an standalone module | 
|  | 39 |  | 
|  | 40 | To compile | 
|  | 41 |  | 
|  | 42 | $ cd source/directory | 
|  | 43 | $ make | 
|  | 44 |  | 
|  | 45 | Once built you can load and unload using the provided load.sh script; | 
|  | 46 | load.sh will load the modules, load.sh u will unload them. | 
|  | 47 |  | 
|  | 48 | To install in the default kernel directories (and enable auto loading | 
|  | 49 | when the device is plugged): | 
|  | 50 |  | 
|  | 51 | $ make install | 
|  | 52 | $ depmod -a | 
|  | 53 |  | 
|  | 54 | If your kernel development files are located in a non standard | 
|  | 55 | directory or if you want to build for a kernel that is not the | 
|  | 56 | currently running one, set KDIR to the right location: | 
|  | 57 |  | 
|  | 58 | $ make KDIR=/path/to/kernel/dev/tree | 
|  | 59 |  | 
|  | 60 | For more information, please contact linux-wimax@intel.com. | 
|  | 61 |  | 
|  | 62 | 3. Installing the firmware | 
|  | 63 |  | 
|  | 64 | The firmware can be obtained from http://linuxwimax.org or might have | 
|  | 65 | been supplied with your hardware. | 
|  | 66 |  | 
|  | 67 | It has to be installed in the target system: | 
|  | 68 | * | 
|  | 69 | $ cp FIRMWAREFILE.sbcf /lib/firmware/i2400m-fw-BUSTYPE-1.3.sbcf | 
|  | 70 |  | 
|  | 71 | * NOTE: if your firmware came in an .rpm or .deb file, just install | 
|  | 72 | it as normal, with the rpm (rpm -i FIRMWARE.rpm) or dpkg | 
|  | 73 | (dpkg -i FIRMWARE.deb) commands. No further action is needed. | 
|  | 74 | * BUSTYPE will be usb or sdio, depending on the hardware you have. | 
|  | 75 | Each hardware type comes with its own firmware and will not work | 
|  | 76 | with other types. | 
|  | 77 |  | 
|  | 78 | 4. Design | 
|  | 79 |  | 
|  | 80 | This package contains two major parts: a WiMAX kernel stack and a | 
|  | 81 | driver for the Intel i2400m. | 
|  | 82 |  | 
|  | 83 | The WiMAX stack is designed to provide for common WiMAX control | 
|  | 84 | services to current and future WiMAX devices from any vendor; please | 
|  | 85 | see README.wimax for details. | 
|  | 86 |  | 
|  | 87 | The i2400m kernel driver is broken up in two main parts: the bus | 
|  | 88 | generic driver and the bus-specific drivers. The bus generic driver | 
|  | 89 | forms the drivercore and contain no knowledge of the actual method we | 
|  | 90 | use to connect to the device. The bus specific drivers are just the | 
|  | 91 | glue to connect the bus-generic driver and the device. Currently only | 
|  | 92 | USB and SDIO are supported. See drivers/net/wimax/i2400m/i2400m.h for | 
|  | 93 | more information. | 
|  | 94 |  | 
|  | 95 | The bus generic driver is logically broken up in two parts: OS-glue and | 
|  | 96 | hardware-glue. The OS-glue interfaces with Linux. The hardware-glue | 
|  | 97 | interfaces with the device on using an interface provided by the | 
|  | 98 | bus-specific driver. The reason for this breakup is to be able to | 
|  | 99 | easily reuse the hardware-glue to write drivers for other OSes; note | 
|  | 100 | the hardware glue part is written as a native Linux driver; no | 
|  | 101 | abstraction layers are used, so to port to another OS, the Linux kernel | 
|  | 102 | API calls should be replaced with the target OS's. | 
|  | 103 |  | 
|  | 104 | 5. Usage | 
|  | 105 |  | 
|  | 106 | To load the driver, follow the instructions in the install section; | 
|  | 107 | once the driver is loaded, plug in the device (unless it is permanently | 
|  | 108 | plugged in). The driver will enumerate the device, upload the firmware | 
|  | 109 | and output messages in the kernel log (dmesg, /var/log/messages or | 
|  | 110 | /var/log/kern.log) such as: | 
|  | 111 |  | 
|  | 112 | ... | 
|  | 113 | i2400m_usb 5-4:1.0: firmware interface version 8.0.0 | 
|  | 114 | i2400m_usb 5-4:1.0: WiMAX interface wmx0 (00:1d:e1:01:94:2c) ready | 
|  | 115 |  | 
|  | 116 | At this point the device is ready to work. | 
|  | 117 |  | 
|  | 118 | Current versions require the Intel WiMAX Network Service in userspace | 
|  | 119 | to make things work. See the network service's README for instructions | 
|  | 120 | on how to scan, connect and disconnect. | 
|  | 121 |  | 
|  | 122 | 5.1. Module parameters | 
|  | 123 |  | 
|  | 124 | Module parameters can be set at kernel or module load time or by | 
|  | 125 | echoing values: | 
|  | 126 |  | 
|  | 127 | $ echo VALUE > /sys/module/MODULENAME/parameters/PARAMETERNAME | 
|  | 128 |  | 
|  | 129 | To make changes permanent, for example, for the i2400m module, you can | 
|  | 130 | also create a file named /etc/modprobe.d/i2400m containing: | 
|  | 131 |  | 
|  | 132 | options i2400m idle_mode_disabled=1 | 
|  | 133 |  | 
|  | 134 | To find which parameters are supported by a module, run: | 
|  | 135 |  | 
|  | 136 | $ modinfo path/to/module.ko | 
|  | 137 |  | 
|  | 138 | During kernel bootup (if the driver is linked in the kernel), specify | 
|  | 139 | the following to the kernel command line: | 
|  | 140 |  | 
|  | 141 | i2400m.PARAMETER=VALUE | 
|  | 142 |  | 
|  | 143 | 5.1.1. i2400m: idle_mode_disabled | 
|  | 144 |  | 
|  | 145 | The i2400m module supports a parameter to disable idle mode. This | 
|  | 146 | parameter, once set, will take effect only when the device is | 
|  | 147 | reinitialized by the driver (eg: following a reset or a reconnect). | 
|  | 148 |  | 
|  | 149 | 5.2. Debug operations: debugfs entries | 
|  | 150 |  | 
|  | 151 | The driver will register debugfs entries that allow the user to tweak | 
|  | 152 | debug settings. There are three main container directories where | 
|  | 153 | entries are placed, which correspond to the three blocks a i2400m WiMAX | 
|  | 154 | driver has: | 
|  | 155 | * /sys/kernel/debug/wimax:DEVNAME/ for the generic WiMAX stack | 
|  | 156 | controls | 
|  | 157 | * /sys/kernel/debug/wimax:DEVNAME/i2400m for the i2400m generic | 
|  | 158 | driver controls | 
|  | 159 | * /sys/kernel/debug/wimax:DEVNAME/i2400m-usb (or -sdio) for the | 
|  | 160 | bus-specific i2400m-usb or i2400m-sdio controls). | 
|  | 161 |  | 
|  | 162 | Of course, if debugfs is mounted in a directory other than | 
|  | 163 | /sys/kernel/debug, those paths will change. | 
|  | 164 |  | 
|  | 165 | 5.2.1. Increasing debug output | 
|  | 166 |  | 
|  | 167 | The files named *dl_* indicate knobs for controlling the debug output | 
|  | 168 | of different submodules: | 
|  | 169 | * | 
|  | 170 | # find /sys/kernel/debug/wimax\:wmx0 -name \*dl_\* | 
|  | 171 | /sys/kernel/debug/wimax:wmx0/i2400m-usb/dl_tx | 
|  | 172 | /sys/kernel/debug/wimax:wmx0/i2400m-usb/dl_rx | 
|  | 173 | /sys/kernel/debug/wimax:wmx0/i2400m-usb/dl_notif | 
|  | 174 | /sys/kernel/debug/wimax:wmx0/i2400m-usb/dl_fw | 
|  | 175 | /sys/kernel/debug/wimax:wmx0/i2400m-usb/dl_usb | 
|  | 176 | /sys/kernel/debug/wimax:wmx0/i2400m/dl_tx | 
|  | 177 | /sys/kernel/debug/wimax:wmx0/i2400m/dl_rx | 
|  | 178 | /sys/kernel/debug/wimax:wmx0/i2400m/dl_rfkill | 
|  | 179 | /sys/kernel/debug/wimax:wmx0/i2400m/dl_netdev | 
|  | 180 | /sys/kernel/debug/wimax:wmx0/i2400m/dl_fw | 
|  | 181 | /sys/kernel/debug/wimax:wmx0/i2400m/dl_debugfs | 
|  | 182 | /sys/kernel/debug/wimax:wmx0/i2400m/dl_driver | 
|  | 183 | /sys/kernel/debug/wimax:wmx0/i2400m/dl_control | 
|  | 184 | /sys/kernel/debug/wimax:wmx0/wimax_dl_stack | 
|  | 185 | /sys/kernel/debug/wimax:wmx0/wimax_dl_op_rfkill | 
|  | 186 | /sys/kernel/debug/wimax:wmx0/wimax_dl_op_reset | 
|  | 187 | /sys/kernel/debug/wimax:wmx0/wimax_dl_op_msg | 
|  | 188 | /sys/kernel/debug/wimax:wmx0/wimax_dl_id_table | 
|  | 189 | /sys/kernel/debug/wimax:wmx0/wimax_dl_debugfs | 
|  | 190 |  | 
|  | 191 | By reading the file you can obtain the current value of said debug | 
|  | 192 | level; by writing to it, you can set it. | 
|  | 193 |  | 
|  | 194 | To increase the debug level of, for example, the i2400m's generic TX | 
|  | 195 | engine, just write: | 
|  | 196 |  | 
|  | 197 | $ echo 3 > /sys/kernel/debug/wimax:wmx0/i2400m/dl_tx | 
|  | 198 |  | 
|  | 199 | Increasing numbers yield increasing debug information; for details of | 
|  | 200 | what is printed and the available levels, check the source. The code | 
|  | 201 | uses 0 for disabled and increasing values until 8. | 
|  | 202 |  | 
|  | 203 | 5.2.2. RX and TX statistics | 
|  | 204 |  | 
|  | 205 | The i2400m/rx_stats and i2400m/tx_stats provide statistics about the | 
|  | 206 | data reception/delivery from the device: | 
|  | 207 |  | 
|  | 208 | $ cat /sys/kernel/debug/wimax:wmx0/i2400m/rx_stats | 
|  | 209 | 45 1 3 34 3104 48 480 | 
|  | 210 |  | 
|  | 211 | The numbers reported are | 
|  | 212 | * packets/RX-buffer: total, min, max | 
|  | 213 | * RX-buffers: total RX buffers received, accumulated RX buffer size | 
|  | 214 | in bytes, min size received, max size received | 
|  | 215 |  | 
|  | 216 | Thus, to find the average buffer size received, divide accumulated | 
|  | 217 | RX-buffer / total RX-buffers. | 
|  | 218 |  | 
|  | 219 | To clear the statistics back to 0, write anything to the rx_stats file: | 
|  | 220 |  | 
|  | 221 | $ echo 1 > /sys/kernel/debug/wimax:wmx0/i2400m_rx_stats | 
|  | 222 |  | 
|  | 223 | Likewise for TX. | 
|  | 224 |  | 
|  | 225 | Note the packets this debug file refers to are not network packet, but | 
|  | 226 | packets in the sense of the device-specific protocol for communication | 
|  | 227 | to the host. See drivers/net/wimax/i2400m/tx.c. | 
|  | 228 |  | 
|  | 229 | 5.2.3. Tracing messages received from user space | 
|  | 230 |  | 
|  | 231 | To echo messages received from user space into the trace pipe that the | 
|  | 232 | i2400m driver creates, set the debug file i2400m/trace_msg_from_user to | 
|  | 233 | 1: | 
|  | 234 | * | 
|  | 235 | $ echo 1 > /sys/kernel/debug/wimax:wmx0/i2400m/trace_msg_from_user | 
|  | 236 |  | 
|  | 237 | 5.2.4. Performing a device reset | 
|  | 238 |  | 
|  | 239 | By writing a 0, a 1 or a 2 to the file | 
|  | 240 | /sys/kernel/debug/wimax:wmx0/reset, the driver performs a warm (without | 
|  | 241 | disconnecting from the bus), cold (disconnecting from the bus) or bus | 
|  | 242 | (bus specific) reset on the device. | 
|  | 243 |  | 
|  | 244 | 5.2.5. Asking the device to enter power saving mode | 
|  | 245 |  | 
|  | 246 | By writing any value to the /sys/kernel/debug/wimax:wmx0 file, the | 
|  | 247 | device will attempt to enter power saving mode. | 
|  | 248 |  | 
|  | 249 | 6. Troubleshooting | 
|  | 250 |  | 
|  | 251 | 6.1. Driver complains about 'i2400m-fw-usb-1.2.sbcf: request failed' | 
|  | 252 |  | 
|  | 253 | If upon connecting the device, the following is output in the kernel | 
|  | 254 | log: | 
|  | 255 |  | 
|  | 256 | i2400m_usb 5-4:1.0: fw i2400m-fw-usb-1.3.sbcf: request failed: -2 | 
|  | 257 |  | 
|  | 258 | This means that the driver cannot locate the firmware file named | 
|  | 259 | /lib/firmware/i2400m-fw-usb-1.2.sbcf. Check that the file is present in | 
|  | 260 | the right location. |