summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/ath
AgeCommit message (Collapse)Author
2012-03-07ath6kl: make ath6kl_bmi_[read|write]_hi32() endian safeKalle Valo
ath6kl_bmi_[read|write]_hi32() did not have endian support, fix that. Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-07ath6kl: fix too long linesKalle Valo
Found by checkpatch: drivers/net/wireless/ath/ath6kl/init.c:78: WARNING: line over 80 characters drivers/net/wireless/ath/ath6kl/init.c:397: WARNING: line over 80 characters drivers/net/wireless/ath/ath6kl/init.c:407: WARNING: line over 80 characters drivers/net/wireless/ath/ath6kl/htc.c:189: WARNING: line over 80 characters drivers/net/wireless/ath/ath6kl/htc.c:704: WARNING: line over 80 characters drivers/net/wireless/ath/ath6kl/htc.c:2452: WARNING: line over 80 characters Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-07ath6kl: document all spinlocksKalle Valo
Also fixes quite a few checkpatch warnings like this: ath6kl/hif.h:226: CHECK: spinlock_t definition without comment Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-07ath6kl: fix open paranthesis alignment in ath6kl_cfg80211_connect()Kalle Valo
ath6kl/cfg80211.c:462: CHECK: Alignment should match open parenthesis Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-07ath6kl: fix error handling ath6kl_target_config_wlan_params()Kalle Valo
The error handling in ath6kl_target_config_wlan_params() was just weird, fix that. This also fixes some of the open parenthesis alignment issues reported by checkpatch. Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-07ath6kl: add ath6kl_bmi_read_hi32()Kalle Valo
There are few 32 bit reads from the host interest area. Add ath6kl_bmi_read_hi32() to make it easier to do that. As code is cleaner this also fixes few checkpatch warnings. Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-07ath6kl: add ath6kl_bmi_write_hi32()Kalle Valo
We have a lot of 32 bit writes to the host interest area and the code doing that is ugly. Clean that up by adding ath6kl_bmi_write_hi32(). This also fixes few checkpatch warnings. Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-07ath6kl: remove multiple assignmentsKalle Valo
Found by checkpatch: drivers/net/wireless/ath/ath6kl/cfg80211.c:1295: CHECK: multiple assignments should be avoided drivers/net/wireless/ath/ath6kl/cfg80211.c:3000: CHECK: multiple assignments should be avoided Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-07ath6kl: logical continuations should be on the previous lineKalle Valo
All found by checkpatch: ath6kl/wmi.c:1036: CHECK: Logical continuations should be on the previous line Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-07ath6kl: alignment should match open parenthesisKalle Valo
Fix the issues which checkpatch found and were easy to fix. Especially callers of ath6kl_bmi_write() are tricky and that needs to be fixed separately. Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-07ath6kl: fix checkpatch error with EPSTAT() macroKalle Valo
ath6kl/debug.c:739: ERROR: Macros with complex values should be enclosed in parenthesis Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-07ath6kl: fix pointer styleKalle Valo
reported by checkpatch: ath6kl/core.h:748: ERROR: "foo * bar" should be "foo *bar" ath6kl/core.h:751: ERROR: "foo * bar" should be "foo *bar" Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-07ath6kl: Set optimal listen intvl,bmiss,scan params while going to wow suspendRaja Mani
* In order to save the target power in WOW suspend state, configure the best optimal values for the below parameters, - listen interval. - beacon miss interval. - scan parameters. Default values for above attributes are reverted in wow resume operation. * The default listen interval is set before the host issue connect request. * New function is added to configure beacon miss count. kvalo: minor changes to fix open parenthesis alignment Signed-off-by: Raja Mani <rmani@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-07ath6kl: Maintain the listen interval per VIF specificRaja Mani
Firmware has the option to support the listen interval per vif specific. Fix this. Listen interval can be set by the TUs or by the number of beacons. Current code enables the user to configure the listen interval in the unit of 'number of beacons' using debugfs entry "listen_interval". Going forward, we need to alter the listen interval in the unit of TUs to get good power numbers while going to WOW suspend/resume. Allowing the user to change the listen interval in the unit of "number of beacons" in debugfs and changing listen interval in wow suspend/resume in the unit of time (TUs) would lead us to confuse. This patch make sures the listen interval is changed only in the unit of time (TUs). Signed-off-by: Raja Mani <rmani@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-07ath6kl: Check wow state before sending control and data pktRaja Mani
Below two scenarios are taken care in this patch which helped to fix the firmware crash during wow suspend/resume. * TX operation (ctrl tx and data tx) has to be controlled based on suspend state. i.e, with respect to WOW mode, control packets are allowed to send from the host until the suspend state goes ATH6KL_STATE_WOW and the data packets are allowed until WOW suspend operation starts. * Similarly, wow resume is NOT allowed if WOW suspend is in progress. Signed-off-by: Raja Mani <rmani@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-07ath6kl: Add provision to define suspend policy in disconnected state.Raja Mani
It gives flexibility to the user to define suspend policy when the suspend mode is set to WOW and the device is in disconnected state at the time of suspend. New module parameter wow_mode is added to get the choice from the user. This parameter is valid only if the module parameter suspend_mode is set to WOW. To force WOW in connected state and cut power in disconnected state: suspend_mode=0x3 wow_mode=0x1 To force WOW in connected state and deep sleep in disconnected state (this is also the default wow_mode): suspend_mode=0x3 wow_mode=0x2 If there is no value specified to wow_mode during insmod, deep sleep mode will be tried in the disconnected state. kvalo: clarified commit log Signed-off-by: Raja Mani <rmani@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-06ath6kl: Fix kernel panic while receiving fwlog during bootVasanthakumar Thiagarajan
"ath6kl: Defer wiphy and netdev registration till the end of ath6kl_core_init()" causes kernel panic by accessing the unallocated debug resources during boot time. To fix this, split the debug initialization funtion into two, one initializes the debug resource and the other takes care of debugfs initialization. When this issue shows up the kernel crash dump would look like ath6kl_debug_fwlog_event+0x9c/0x10a [<c10666c9>] register_lock_class+0x57/0x288 [<c1065cd3>] ? trace_hardirqs_on+0xb/0xd [<f801f4c9>] ? ath6kl_debug_fwlog_event+0x9c/0x10a [<c1066a8a>] __lock_acquire+0x96/0xbe5 [<c106007b>] ? alarmtimer_suspend+0x80/0x127 [<c10258da>] ? vprintk+0x394/0x3b1 [<f801f4c9>] ? ath6kl_debug_fwlog_event+0x9c/0x10a [<c10676b3>] lock_acquire+0xda/0xf9 [<f801f4c9>] ? ath6kl_debug_fwlog_event+0x9c/0x10a [<c1532ce3>] _raw_spin_lock+0x28/0x58 [<f801f4c9>] ? ath6kl_debug_fwlog_event+0x9c/0x10a [<f801f4c9>] ath6kl_debug_fwlog_event+0x9c/0x10a [<f80310a4>] ath6kl_wmi_control_rx+0x69d/0xb50 [ath6kl_core] [<f802d2e1>] ? ath6kl_rx+0x3c/0x839 [ath6kl_core] [<f802d35d>] ath6kl_rx+0xb8/0x839 [ath6kl_core] [<c104b81e>] ? local_clock+0x2d/0x4e [<c102a0af>] ? _local_bh_enable_ip+0x94/0x98 [<f802bfc0>] ? ath6kl_alloc_amsdu_rxbuf+0xb7/0xb7 [<f8023b28>] ath6kl_htc_rxmsg_pending_handler+0x891/0x988 [ath6kl_core] [<f802bf00>] ? ath6kl_refill_amsdu_rxbufs+0x89/0x92 [<f802d2a5>] ? aggr_timeout+0xed/0xed [ath6kl_core] [<f802bfc0>] ? ath6kl_alloc_amsdu_rxbuf+0xb7/0xb7 [<f802c420>] ? ath6kl_tx_complete+0x376/0x376 [ath6kl_core] [<f8020e92>] ath6kl_hif_intr_bh_handler+0xf7/0x33e [<c138ab00>] ? mmc_host_disable+0x15/0x3a [<f8123b5c>] ath6kl_sdio_irq_handler+0x3c/0x90 [ath6kl_sdio] [<c1392f56>] sdio_irq_thread+0xb6/0x29c [<c1392ea0>] ? sdio_claim_irq+0x1cb/0x1cb [<c103d4c0>] kthread+0x67/0x6c [<c103d459>] ? __init_kthread_worker+0x42/0x42 [<c153903a>] kernel_thread_helper+0x6/0xd BUG: unable to handle kernel NULL pointer dereference at EIP: [<f801f4d4>] ath6kl_debug_fwlog_event+0xa7/0x10a kvalo: rename new function to ath6kl_debug_init_fs() and add a comment why it's needed Reported-by: Kalle Valo <kvalo@qca.qualcomm.com> Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-05Merge remote branch 'wireless-next/master' into ath6kl-nextKalle Valo
Conflicts: drivers/net/wireless/ath/ath6kl/cfg80211.c
2012-03-05ath6kl: Restrict memcpy to bounce buffer only for write requestRaja Mani
No need to copy received local buffer content to bounce buffer (DMA buffer) while performing sync READ operation from the chip. It's applicable for only WRITE operation. Signed-off-by: Raja Mani <rmani@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-01ath6kl: Fix random system lockupRaja Mani
The commit "ath6kl: Use a mutex_lock to avoid race in diabling and handling irq" introduces a state where ath6kl_sdio_irq_handler() would be waiting to claim the sdio function for receive indefinitely when things happen in the following order. ath6kl_sdio_irq_handler() - aquires mtx_irq - sdio_release_host() ath6kl_sdio_irq_disable() - sdio_claim_host() - sleep on mtx_irq ath6kl_hif_intr_bh_handler() - (indefinitely) wait for the sdio function to be released to exclusively claim it again for receive operation. Fix this by replacing the mtx_irq with an atomic variable and a wait_queue. kvalo: add ath6kl_sdio_is_on_irq() due to open parenthesis alignment Signed-off-by: Raja Mani <rmani@qca.qualcomm.com> Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-01ath6kl: Collect residue firmware logsEtay Luz
Collect residue firmware logs following firmware assert. Firmware sends logs to host once the 1500 byte log buffer has been filled. At time of assert, there could be residue logs lying in the firmware. This patch pulls those residue logs. This would give the full picture of the firmware. Signed-off-by: Etay Luz <eluz@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-01ath6kl: add padding to firmware log recordsEtay Luz
firmware debug utility expects firmware log record size to be 1500 bytes. This patch ensures that the firmware record will be exactly 1500 bytes. kvalo: remove trailing space Signed-off-by: Etay Luz <eluz@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-01ath6kl: implement hidden ssidThomas Pedersen
The ath6kl FW does not distinguish between different types of hidden SSIDs (empty or null), so treat all cfg80211 requests for hidden ssid the same. Signed-off-by: Thomas Pedersen <c_tpeder@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-01ath6kl: Clear the IE in firmware if not setAarthi Thiruvengadam
Remove check so that IE in firmware is cleared if not set. Without this fix, any previously set IE will be used incorrectly in the next frame. For example, consider the scenario where a P2P device scan is followed by a regular station scan. The P2P IE set by the P2P scan needs to be cleared, otherwise the station scan will contain the P2P IE. kvalo: indentation fixes Signed-off-by: Aarthi Thiruvengadam <athiruve@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-01ath6kl: Make sure wiphy is registered before calling regulatory_hint()Vasanthakumar Thiagarajan
As regulatory events are processed even before the wiphy is registered, calling regulatory_hint() at early stage should be fixed. Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-01ath6kl: Defer wiphy and netdev registration till the end of ath6kl_core_init()Vasanthakumar Thiagarajan
This makes the wiphy and initial netdev registration the last step in dev initialization. Apart from the fact that this looks right, it can also be used to setup wiphy with the regulatory information received from firmware after uploading the firmware. Also it fixes a FIXME in ath6kl_core_init() where mac address is copied into netdev->dev_addr, ath6kl_interface_add() takes care of this as well. Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-01ath6kl: Skip vif index validation in ath6kl_rx() for wmi eventsVasanthakumar Thiagarajan
When the wmi event is vif specific, the validation of vif index is taken care in ath6kl_wmi_proc_events_iface(). This also avoids the need for a netdev to be registered while receiving initial events like "target_ready" and "regulatory domain". Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-01ath6kl: Refactor ath6kl_wmi_control_rx()Vasanthakumar Thiagarajan
Split the wmi event processing into the one which needs to be vif specific and the reset. This is a step towards avoiding the need for wiphy and a netdev registration before getting any message from firmware. Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-01ath6kl: Initialize netdev hw_features for every interfaceVasanthakumar Thiagarajan
Move netdev->hw_features setting from ath6kl_core_init() to init_netdev() so that it is done for every interface. Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-03-01ath6kl: Group wiphy initialization into ath6kl_cfg80211_init()Vasanthakumar Thiagarajan
There are some code which initializes various wiphy members left outside ath6kl_cfg80211_init(), in ath6kl_core_init(). Move them into a single palce. Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-02-29carl9170: fix breakage from "mac80211: handle non-bufferable MMPDUs correctly"John W. Linville
That commit intended for 3.4 renamed IEEE80211_TX_CTL_POLL_RESPONSE as IEEE80211_TX_CTL_NO_PS_BUFFER. Meanwhile, "carl9170: fix frame delivery if sta is in powersave mode" added a reference to IEEE80211_TX_CTL_POLL_RESPONSE in the fixes stream for 3.3. This simple patch fixes that merge boo-boo. Signed-off-by: John W. Linville <linville@tuxdriver.com>
2012-02-29Merge branch 'master' of ↵John W. Linville
git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
2012-02-29ath9k: decouple RX error checking for DFSZefir Kurtisi
Previous RX error checking was done exclusive-or for different error types and caused DFS pulse events to be dropped when other error flags (e.g. CRC) were set simultaneously. This patch decouples PHY error processing from other types and ensures that all pulses detected by HW are accounted by the pattern detector. Signed-off-by: Zefir Kurtisi <zefir.kurtisi@neratec.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
2012-02-29carl9170: fix frame delivery if sta is in powersave modeChristian Lamparter
Nicolas Cavallari discovered that carl9170 has some serious problems delivering data to sleeping stations. It turns out that the driver was not honoring two important flags (IEEE80211_TX_CTL_POLL_RESPONSE and IEEE80211_TX_CTL_CLEAR_PS_FILT) which are set on frames that should be sent although the receiving station is still in powersave mode. Cc: stable <stable@vger.kernel.org> Reported-by: Nicolas Cavallari <Nicolas.Cavallari@lri.fr> Signed-off-by: Christian Lamparter <chunkeey@googlemail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
2012-02-29carl9170: Fix memory accounting when sta is in power-save mode.Nicolas Cavallari
On Access Point mode, when transmitting a packet, if the destination station is in powersave mode, we abort transmitting the packet to the device queue, but we do not reclaim the allocated memory. Given enough packets, we can go in a state where there is no packet on the device queue, but we think the device has no memory left, so no packet gets transmitted, connections breaks and the AP stops working. This undo the allocation done in the TX path when the station is in power-save mode. Signed-off-by: Nicolas Cavallari <cavallar@lri.fr> Acked-by: Christian Lamparter <chunkeey@googlemail.com> Cc: stable <stable@vger.kernel.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
2012-02-28ath6kl: Register driver ht capabilities in wiphyVasanthakumar Thiagarajan
Register driver's ht capabilities in wiphy to avoid failures in setting ht channels from hostapd. Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-02-28ath6kl: Lower SDIO pad drive strength for hw2.1.1 boardRaja Mani
Without this change, SDIO shuts down due to CRC error during data communication to the firmware in some of the platform. for example, scan request issued to the firmware doesn't return scan completed events and cause the socket interface to always return -16 (device busy). SDIO pad drive strength should be reduced for hw2.1.1 board to avoid such errors. Signed-off-by: Raja Mani <rmani@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-02-28ath6kl: Make foreground scan a deterministic oneVasanthakumar Thiagarajan
This makes the device get into scan state as soon as a scan request is received, instead of blocking the scan request till the traffic comes down. It is necessary for the deterministic foreground scan particularly when having multiple vif operating where, if the scan is non- deterministic, scan on one interface will not start as long as there are traffic on the other interface. This change passes 50 msec as foreground scan interval to fix this. Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-02-28ath6kl: Fix memory leak of rx packets in endpoint 0Vasanthakumar Thiagarajan
htc_packet and htc_packet->buf_start are separately allocated for endpoint 0. This is different for other endpoints where packets are allocated as skb where htc_packet is skb->head and they are freed properly. Free htc_packet and htc_packet->buf_start separatly for endpoint 0. Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-02-28ath6kl: Make sure to allocate rx buffers after the endpoint connectionVasanthakumar Thiagarajan
Rx buffers should be allocated for control and best effort endpoints only after the enpoints connection is esablished. But this is done before the endpoint connection is complete, we don't even the control and BE endpoints that time. Move the buffer allocation after endpoint connection is over, after ath6kl_init_hw_start(). Found in review, never seen any real issue with this. Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
2012-02-27ath9k: Cleanup mci.cSujith Manoharan
Cleanup whitespace, fix indentation and coding style. Also remove debug messages that were flooding the log. Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
2012-02-27ath9k_hw: MCI whitespace/debug cleanupSujith Manoharan
This patch fixes indentation and the general coding style in ar9003_mci.c. Also, minimize the amount of debug log output generated by MCI. Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
2012-02-27ath9k_hw: Remove HW revision checksSujith Manoharan
They are not needed since MCI will be enabled only for AR9462 v2.0 Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
2012-02-27ath9k_hw: Cleanup MCI reset routineSujith Manoharan
* Use a separate function to enable/disable OneStepLookAhead. * Remove unnecessary hardware SREV checks. Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
2012-02-27ath9k: Modify ATH9K_BTCOEX_SUPPORTSujith Manoharan
ATH9K_BTCOEX_SUPPORT is now used by both ath9k and ath9k_htc to enable BT coexistence. Fix Kbuild to allow this. Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
2012-02-27ath9k: Remove ATH9K_HW_CAP_MCI checksSujith Manoharan
With the ability to remove BTCOEX support at compile time, these checks are no longer needed. Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
2012-02-27ath9k: Remove ATH_BTCOEX_CFG_NONE checksSujith Manoharan
Since BTCOEX code can be compiled out cleanly now, remove these checks. Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
2012-02-27ath9k_htc: Use CONFIG_ATH9K_BTCOEX_SUPPORTSujith Manoharan
ath9k_htc can also make use of CONFIG_ATH9K_BTCOEX_SUPPORT to be compiled without BTCOEX support. Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
2012-02-27ath9k_htc: Init BTCOEX inside htc_drv_gpio.cSujith Manoharan
Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
2012-02-27ath9k_htc: Start/stop btcoex using a helperSujith Manoharan
Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>