261 lines
		
	
	
	
		
			9.5 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			261 lines
		
	
	
	
		
			9.5 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
|   | 
 | ||
|  |    Driver for the Intel Wireless Wimax Connection 2400m | ||
|  | 
 | ||
|  |    (C) 2008 Intel Corporation < linux-wimax@intel.com > | ||
|  | 
 | ||
|  |    This provides a driver for the Intel Wireless WiMAX Connection 2400m | ||
|  |    and a basic Linux kernel WiMAX stack. | ||
|  | 
 | ||
|  | 1. Requirements | ||
|  | 
 | ||
|  |      * Linux installation with Linux kernel 2.6.22 or newer (if building | ||
|  |        from a separate tree) | ||
|  |      * Intel i2400m Echo Peak or Baxter Peak; this includes the Intel | ||
|  |        Wireless WiMAX/WiFi Link 5x50 series. | ||
|  |      * build tools: | ||
|  |           + Linux kernel development package for the target kernel; to | ||
|  |             build against your currently running kernel, you need to have | ||
|  |             the kernel development package corresponding to the running | ||
|  |             image installed (usually if your kernel is named | ||
|  |             linux-VERSION, the development package is called | ||
|  |             linux-dev-VERSION or linux-headers-VERSION). | ||
|  |           + GNU C Compiler, make | ||
|  | 
 | ||
|  | 2. Compilation and installation | ||
|  | 
 | ||
|  | 2.1. Compilation of the drivers included in the kernel | ||
|  | 
 | ||
|  |    Configure the kernel; to enable the WiMAX drivers select Drivers > | ||
|  |    Networking Drivers > WiMAX device support. Enable all of them as | ||
|  |    modules (easier). | ||
|  | 
 | ||
|  |    If USB or SDIO are not enabled in the kernel configuration, the options | ||
|  |    to build the i2400m USB or SDIO drivers will not show. Enable said | ||
|  |    subsystems and go back to the WiMAX menu to enable the drivers. | ||
|  | 
 | ||
|  |    Compile and install your kernel as usual. | ||
|  | 
 | ||
|  | 2.2. Compilation of the drivers distributed as an standalone module | ||
|  | 
 | ||
|  |    To compile | ||
|  | 
 | ||
|  | $ cd source/directory | ||
|  | $ make | ||
|  | 
 | ||
|  |    Once built you can load and unload using the provided load.sh script; | ||
|  |    load.sh will load the modules, load.sh u will unload them. | ||
|  | 
 | ||
|  |    To install in the default kernel directories (and enable auto loading | ||
|  |    when the device is plugged): | ||
|  | 
 | ||
|  | $ make install | ||
|  | $ depmod -a | ||
|  | 
 | ||
|  |    If your kernel development files are located in a non standard | ||
|  |    directory or if you want to build for a kernel that is not the | ||
|  |    currently running one, set KDIR to the right location: | ||
|  | 
 | ||
|  | $ make KDIR=/path/to/kernel/dev/tree | ||
|  | 
 | ||
|  |    For more information, please contact linux-wimax@intel.com. | ||
|  | 
 | ||
|  | 3. Installing the firmware | ||
|  | 
 | ||
|  |    The firmware can be obtained from http://linuxwimax.org or might have | ||
|  |    been supplied with your hardware. | ||
|  | 
 | ||
|  |    It has to be installed in the target system: | ||
|  |      * | ||
|  | $ cp FIRMWAREFILE.sbcf /lib/firmware/i2400m-fw-BUSTYPE-1.3.sbcf | ||
|  | 
 | ||
|  |      * NOTE: if your firmware came in an .rpm or .deb file, just install | ||
|  |        it as normal, with the rpm (rpm -i FIRMWARE.rpm) or dpkg | ||
|  |        (dpkg -i FIRMWARE.deb) commands. No further action is needed. | ||
|  |      * BUSTYPE will be usb or sdio, depending on the hardware you have. | ||
|  |        Each hardware type comes with its own firmware and will not work | ||
|  |        with other types. | ||
|  | 
 | ||
|  | 4. Design | ||
|  | 
 | ||
|  |    This package contains two major parts: a WiMAX kernel stack and a | ||
|  |    driver for the Intel i2400m. | ||
|  | 
 | ||
|  |    The WiMAX stack is designed to provide for common WiMAX control | ||
|  |    services to current and future WiMAX devices from any vendor; please | ||
|  |    see README.wimax for details. | ||
|  | 
 | ||
|  |    The i2400m kernel driver is broken up in two main parts: the bus | ||
|  |    generic driver and the bus-specific drivers. The bus generic driver | ||
|  |    forms the drivercore and contain no knowledge of the actual method we | ||
|  |    use to connect to the device. The bus specific drivers are just the | ||
|  |    glue to connect the bus-generic driver and the device. Currently only | ||
|  |    USB and SDIO are supported. See drivers/net/wimax/i2400m/i2400m.h for | ||
|  |    more information. | ||
|  | 
 | ||
|  |    The bus generic driver is logically broken up in two parts: OS-glue and | ||
|  |    hardware-glue. The OS-glue interfaces with Linux. The hardware-glue | ||
|  |    interfaces with the device on using an interface provided by the | ||
|  |    bus-specific driver. The reason for this breakup is to be able to | ||
|  |    easily reuse the hardware-glue to write drivers for other OSes; note | ||
|  |    the hardware glue part is written as a native Linux driver; no | ||
|  |    abstraction layers are used, so to port to another OS, the Linux kernel | ||
|  |    API calls should be replaced with the target OS's. | ||
|  | 
 | ||
|  | 5. Usage | ||
|  | 
 | ||
|  |    To load the driver, follow the instructions in the install section; | ||
|  |    once the driver is loaded, plug in the device (unless it is permanently | ||
|  |    plugged in). The driver will enumerate the device, upload the firmware | ||
|  |    and output messages in the kernel log (dmesg, /var/log/messages or | ||
|  |    /var/log/kern.log) such as: | ||
|  | 
 | ||
|  | ... | ||
|  | i2400m_usb 5-4:1.0: firmware interface version 8.0.0 | ||
|  | i2400m_usb 5-4:1.0: WiMAX interface wmx0 (00:1d:e1:01:94:2c) ready | ||
|  | 
 | ||
|  |    At this point the device is ready to work. | ||
|  | 
 | ||
|  |    Current versions require the Intel WiMAX Network Service in userspace | ||
|  |    to make things work. See the network service's README for instructions | ||
|  |    on how to scan, connect and disconnect. | ||
|  | 
 | ||
|  | 5.1. Module parameters | ||
|  | 
 | ||
|  |    Module parameters can be set at kernel or module load time or by | ||
|  |    echoing values: | ||
|  | 
 | ||
|  | $ echo VALUE > /sys/module/MODULENAME/parameters/PARAMETERNAME | ||
|  | 
 | ||
|  |    To make changes permanent, for example, for the i2400m module, you can | ||
|  |    also create a file named /etc/modprobe.d/i2400m containing: | ||
|  | 
 | ||
|  | options i2400m idle_mode_disabled=1 | ||
|  | 
 | ||
|  |    To find which parameters are supported by a module, run: | ||
|  | 
 | ||
|  | $ modinfo path/to/module.ko | ||
|  | 
 | ||
|  |    During kernel bootup (if the driver is linked in the kernel), specify | ||
|  |    the following to the kernel command line: | ||
|  | 
 | ||
|  | i2400m.PARAMETER=VALUE | ||
|  | 
 | ||
|  | 5.1.1. i2400m: idle_mode_disabled | ||
|  | 
 | ||
|  |    The i2400m module supports a parameter to disable idle mode. This | ||
|  |    parameter, once set, will take effect only when the device is | ||
|  |    reinitialized by the driver (eg: following a reset or a reconnect). | ||
|  | 
 | ||
|  | 5.2. Debug operations: debugfs entries | ||
|  | 
 | ||
|  |    The driver will register debugfs entries that allow the user to tweak | ||
|  |    debug settings. There are three main container directories where | ||
|  |    entries are placed, which correspond to the three blocks a i2400m WiMAX | ||
|  |    driver has: | ||
|  |      * /sys/kernel/debug/wimax:DEVNAME/ for the generic WiMAX stack | ||
|  |        controls | ||
|  |      * /sys/kernel/debug/wimax:DEVNAME/i2400m for the i2400m generic | ||
|  |        driver controls | ||
|  |      * /sys/kernel/debug/wimax:DEVNAME/i2400m-usb (or -sdio) for the | ||
|  |        bus-specific i2400m-usb or i2400m-sdio controls). | ||
|  | 
 | ||
|  |    Of course, if debugfs is mounted in a directory other than | ||
|  |    /sys/kernel/debug, those paths will change. | ||
|  | 
 | ||
|  | 5.2.1. Increasing debug output | ||
|  | 
 | ||
|  |    The files named *dl_* indicate knobs for controlling the debug output | ||
|  |    of different submodules: | ||
|  |      * | ||
|  | # find /sys/kernel/debug/wimax\:wmx0 -name \*dl_\* | ||
|  | /sys/kernel/debug/wimax:wmx0/i2400m-usb/dl_tx | ||
|  | /sys/kernel/debug/wimax:wmx0/i2400m-usb/dl_rx | ||
|  | /sys/kernel/debug/wimax:wmx0/i2400m-usb/dl_notif | ||
|  | /sys/kernel/debug/wimax:wmx0/i2400m-usb/dl_fw | ||
|  | /sys/kernel/debug/wimax:wmx0/i2400m-usb/dl_usb | ||
|  | /sys/kernel/debug/wimax:wmx0/i2400m/dl_tx | ||
|  | /sys/kernel/debug/wimax:wmx0/i2400m/dl_rx | ||
|  | /sys/kernel/debug/wimax:wmx0/i2400m/dl_rfkill | ||
|  | /sys/kernel/debug/wimax:wmx0/i2400m/dl_netdev | ||
|  | /sys/kernel/debug/wimax:wmx0/i2400m/dl_fw | ||
|  | /sys/kernel/debug/wimax:wmx0/i2400m/dl_debugfs | ||
|  | /sys/kernel/debug/wimax:wmx0/i2400m/dl_driver | ||
|  | /sys/kernel/debug/wimax:wmx0/i2400m/dl_control | ||
|  | /sys/kernel/debug/wimax:wmx0/wimax_dl_stack | ||
|  | /sys/kernel/debug/wimax:wmx0/wimax_dl_op_rfkill | ||
|  | /sys/kernel/debug/wimax:wmx0/wimax_dl_op_reset | ||
|  | /sys/kernel/debug/wimax:wmx0/wimax_dl_op_msg | ||
|  | /sys/kernel/debug/wimax:wmx0/wimax_dl_id_table | ||
|  | /sys/kernel/debug/wimax:wmx0/wimax_dl_debugfs | ||
|  | 
 | ||
|  |    By reading the file you can obtain the current value of said debug | ||
|  |    level; by writing to it, you can set it. | ||
|  | 
 | ||
|  |    To increase the debug level of, for example, the i2400m's generic TX | ||
|  |    engine, just write: | ||
|  | 
 | ||
|  | $ echo 3 > /sys/kernel/debug/wimax:wmx0/i2400m/dl_tx | ||
|  | 
 | ||
|  |    Increasing numbers yield increasing debug information; for details of | ||
|  |    what is printed and the available levels, check the source. The code | ||
|  |    uses 0 for disabled and increasing values until 8. | ||
|  | 
 | ||
|  | 5.2.2. RX and TX statistics | ||
|  | 
 | ||
|  |    The i2400m/rx_stats and i2400m/tx_stats provide statistics about the | ||
|  |    data reception/delivery from the device: | ||
|  | 
 | ||
|  | $ cat /sys/kernel/debug/wimax:wmx0/i2400m/rx_stats | ||
|  | 45 1 3 34 3104 48 480 | ||
|  | 
 | ||
|  |    The numbers reported are | ||
|  |      * packets/RX-buffer: total, min, max | ||
|  |      * RX-buffers: total RX buffers received, accumulated RX buffer size | ||
|  |        in bytes, min size received, max size received | ||
|  | 
 | ||
|  |    Thus, to find the average buffer size received, divide accumulated | ||
|  |    RX-buffer / total RX-buffers. | ||
|  | 
 | ||
|  |    To clear the statistics back to 0, write anything to the rx_stats file: | ||
|  | 
 | ||
|  | $ echo 1 > /sys/kernel/debug/wimax:wmx0/i2400m_rx_stats | ||
|  | 
 | ||
|  |    Likewise for TX. | ||
|  | 
 | ||
|  |    Note the packets this debug file refers to are not network packet, but | ||
|  |    packets in the sense of the device-specific protocol for communication | ||
|  |    to the host. See drivers/net/wimax/i2400m/tx.c. | ||
|  | 
 | ||
|  | 5.2.3. Tracing messages received from user space | ||
|  | 
 | ||
|  |    To echo messages received from user space into the trace pipe that the | ||
|  |    i2400m driver creates, set the debug file i2400m/trace_msg_from_user to | ||
|  |    1: | ||
|  |      * | ||
|  | $ echo 1 > /sys/kernel/debug/wimax:wmx0/i2400m/trace_msg_from_user | ||
|  | 
 | ||
|  | 5.2.4. Performing a device reset | ||
|  | 
 | ||
|  |    By writing a 0, a 1 or a 2 to the file | ||
|  |    /sys/kernel/debug/wimax:wmx0/reset, the driver performs a warm (without | ||
|  |    disconnecting from the bus), cold (disconnecting from the bus) or bus | ||
|  |    (bus specific) reset on the device. | ||
|  | 
 | ||
|  | 5.2.5. Asking the device to enter power saving mode | ||
|  | 
 | ||
|  |    By writing any value to the /sys/kernel/debug/wimax:wmx0 file, the | ||
|  |    device will attempt to enter power saving mode. | ||
|  | 
 | ||
|  | 6. Troubleshooting | ||
|  | 
 | ||
|  | 6.1. Driver complains about 'i2400m-fw-usb-1.2.sbcf: request failed' | ||
|  | 
 | ||
|  |    If upon connecting the device, the following is output in the kernel | ||
|  |    log: | ||
|  | 
 | ||
|  | i2400m_usb 5-4:1.0: fw i2400m-fw-usb-1.3.sbcf: request failed: -2 | ||
|  | 
 | ||
|  |    This means that the driver cannot locate the firmware file named | ||
|  |    /lib/firmware/i2400m-fw-usb-1.2.sbcf. Check that the file is present in | ||
|  |    the right location. |