diff options
author | Ricardo Salveti <ricardo.salveti@openbossa.org> | 2008-09-03 21:46:05 -0300 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@openbossa.org> | 2008-10-23 18:05:41 -0300 |
commit | 8eb2d39c029f548ba4dd97318d9393938ca6e6d8 (patch) | |
tree | 0029544f58cfe67594197262cec4de5ce2d228f4 | |
parent | 5727c4118e89541e8ade10c3d9b55174d2d34815 (diff) |
cx3110x: fix ooops while connecting with nm
Basically we backported sm_drv_set_scan from the new driver, adding
more spin_locks.
Signed-off-by: Ricardo Salveti <ricardo.salveti@openbossa.org>
-rw-r--r-- | packages/mamona/cx3110x-770he-0.8.1/fix_opps_while_connecting_with_nm.patch | 128 | ||||
-rw-r--r-- | packages/mamona/cx3110x-770he_0.8.1.bb | 3 |
2 files changed, 130 insertions, 1 deletions
diff --git a/packages/mamona/cx3110x-770he-0.8.1/fix_opps_while_connecting_with_nm.patch b/packages/mamona/cx3110x-770he-0.8.1/fix_opps_while_connecting_with_nm.patch new file mode 100644 index 0000000000..c73564535f --- /dev/null +++ b/packages/mamona/cx3110x-770he-0.8.1/fix_opps_while_connecting_with_nm.patch @@ -0,0 +1,128 @@ +Index: cx3110x-0.8.1/src/sm_drv_ioctl_umac.c +=================================================================== +--- cx3110x-0.8.1.orig/src/sm_drv_ioctl_umac.c ++++ cx3110x-0.8.1/src/sm_drv_ioctl_umac.c +@@ -1085,28 +1085,31 @@ static int sm_drv_get_wap(struct net_dev + static int sm_drv_set_scan(struct net_device *dev, struct iw_request_info *info, + struct iw_point *vwrq, char *extra) + { +- int ret = 0; ++ int ret = 0, l, msecs; + struct obj_ssid essid; + int16_t scan = -1; + uint32_t scan_mode, flush_bss_list = 1; + struct net_local *lp = dev->priv; + uint32_t bgr_scan_disable = 1; + ++ memset(essid.octets, 0, sizeof(essid.octets)); ++ + if (vwrq == NULL) + return -EINVAL; + + /* First we flush the UMAC's AP list*/ +- ret = sm_drv_oid_set(dev, DOT11_OID_BSSLISTFLUSH, (void*)&flush_bss_list, sizeof(uint32_t)); ++ ret = sm_drv_oid_set(dev, DOT11_OID_BSSLISTFLUSH, ++ (void*)&flush_bss_list, sizeof(uint32_t)); + if (ret < 0) + return ret; + + if (vwrq->flags & IW_SCAN_THIS_ESSID) { + if (vwrq->length > 0) { +- essid.length = vwrq->length - 1; +- memcpy(essid.octets, vwrq->pointer, essid.length + 1); ++ l = vwrq->length; ++ essid.length = min(l, IW_ESSID_MAX_SIZE); ++ memcpy(essid.octets, vwrq->pointer, essid.length); + } else { + essid.length = 0; +- memset(essid.octets, 0, sizeof(essid.octets)); + } + scan_mode = SCAN_MODE_ACTIVE; + } else { +@@ -1114,48 +1117,76 @@ static int sm_drv_set_scan(struct net_de + scan_mode = SCAN_MODE_PASSIVE; + } + +- ret = sm_drv_oid_set(dev, DOT11_OID_SCANMODE, (void*)&scan_mode, sizeof(uint32_t)); ++ ret = sm_drv_oid_set(dev, DOT11_OID_SCANMODE, (void*)&scan_mode, ++ sizeof(uint32_t)); + if (ret < 0) + return ret; + +- ret = sm_drv_oid_set(dev, DOT11_OID_SCANSSID, (void*)&essid, sizeof(struct obj_ssid)); ++ ret = sm_drv_oid_set(dev, DOT11_OID_SCANSSID, (void*)&essid, ++ sizeof(struct obj_ssid)); + if (ret < 0) + return ret; ++ ++ spin_lock_bh(&lp->sm_lock); + + /* We let the background scanning work a bit...*/ +- if (scan_mode == SCAN_MODE_PASSIVE && lp->link_state != DOT11_STATE_ASSOC) +- msleep(2000); ++ if (scan_mode == SCAN_MODE_PASSIVE ++ && lp->link_state != DOT11_STATE_ASSOC) ++ msecs = 2000; ++ else ++ /* for active scan, the delay can be smaller */ ++ msecs = 30; ++ ++ spin_unlock_bh(&lp->sm_lock); ++ ++ msleep(msecs); ++ ++ spin_lock_bh(&lp->sm_lock); + +- /* Let's start the scan timer in case UMAC doesn't trap the scan event */ ++ /* ++ * Let's start the scan timer in case UMAC doesn't trap the scan ++ * event ++ */ + mod_timer(&lp->scan_timer, jiffies + 4 * HZ); + + if (lp->link_state != DOT11_STATE_ASSOC && + lp->bss_type != DOT11_BSSTYPE_IBSS) { ++ spin_unlock_bh(&lp->sm_lock); + ret = sm_drv_oid_set(dev, DOT11_OID_AUTOSCANDISABLE, + (void*)&bgr_scan_disable, + sizeof(uint32_t)); ++ spin_lock_bh(&lp->sm_lock); + if (ret < 0) + return ret; + } ++ spin_unlock_bh(&lp->sm_lock); + + /* And finally we send the scan request */ +- ret = sm_drv_oid_set(dev, DOT11_OID_SCAN, (void*)&scan, sizeof(int16_t)); ++ ret = sm_drv_oid_set(dev, DOT11_OID_SCAN, (void*)&scan, ++ sizeof(int16_t)); ++ + if (ret < 0) { + /* + * If we're associated, we haven't disable bgr scan, + * so we don't need to go there. + */ ++ spin_lock_bh(&lp->sm_lock); + if (lp->link_state != DOT11_STATE_ASSOC && +- lp->bss_type != DOT11_BSSTYPE_IBSS) ++ lp->bss_type != DOT11_BSSTYPE_IBSS) { ++ spin_unlock_bh(&lp->sm_lock); + goto scan_err_out; ++ } ++ spin_unlock_bh(&lp->sm_lock); + } +- ++ + return 0; + + scan_err_out: +- DEBUG(DBG_ALL, "Scanning failed (err: %d), turning background scanning on\n", ret); ++ DEBUG(DBG_ALL, "scanning failed (%d), enabling background scan.", ++ ret); + bgr_scan_disable = 0; +- sm_drv_oid_set(dev, DOT11_OID_AUTOSCANDISABLE, (void*)&bgr_scan_disable, sizeof(uint32_t)); ++ sm_drv_oid_set(dev, DOT11_OID_AUTOSCANDISABLE, ++ (void*)&bgr_scan_disable, sizeof(uint32_t)); + + return ret; + } diff --git a/packages/mamona/cx3110x-770he_0.8.1.bb b/packages/mamona/cx3110x-770he_0.8.1.bb index 7f90aad0dd..8e78ccf208 100644 --- a/packages/mamona/cx3110x-770he_0.8.1.bb +++ b/packages/mamona/cx3110x-770he_0.8.1.bb @@ -1,4 +1,4 @@ -PR = "r1"
+PR = "r2"
KERVER = "2.6.16"
@@ -21,6 +21,7 @@ SRC_URI += "https://garage.maemo.org/frs/download.php/2443/cx3110x-0.8.1.tar.gz file://fix_ssid_data_length.patch;patch=1 \
file://770_performance_improvements.patch;patch=1 \
file://create_sysfs_link_for_wlan0.patch;patch=1 \
+ file://fix_opps_while_connecting_with_nm.patch;patch=1 \
"
do_compile() {
|