Author: weongyo
Date: Tue Oct 20 17:50:36 2009
New Revision: 198300
URL: http://svn.freebsd.org/changeset/base/198300

Log:
  MFC r198098:
    fixes a TX hang bug that it could happen when if_start callback didn't
    be restarted by full of the output queue.
  
    Tested by:      bsduser <bsd at acd.homelinux.org>
  
  MFC r198099:
    fixes a TX hang that could be possible to happen when the trasfers are
    in the high speed that some drivers don't call if_start callback after
    marking ~IFF_DRV_OACTIVE.
  
  Approved by:  re (kib)

Modified:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/usb/wlan/if_rum.c
  stable/8/sys/dev/usb/wlan/if_uath.c
  stable/8/sys/dev/usb/wlan/if_upgt.c
  stable/8/sys/dev/usb/wlan/if_ural.c
  stable/8/sys/dev/usb/wlan/if_urtw.c
  stable/8/sys/dev/usb/wlan/if_zyd.c
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/dev/usb/wlan/if_rum.c
==============================================================================
--- stable/8/sys/dev/usb/wlan/if_rum.c  Tue Oct 20 17:50:27 2009        
(r198299)
+++ stable/8/sys/dev/usb/wlan/if_rum.c  Tue Oct 20 17:50:36 2009        
(r198300)
@@ -826,6 +826,9 @@ tr_setup:
 
                        usbd_transfer_submit(xfer);
                }
+               RUM_UNLOCK(sc);
+               rum_start(ifp);
+               RUM_LOCK(sc);
                break;
 
        default:                        /* Error */
@@ -930,8 +933,8 @@ tr_setup:
                 * the private mutex of a device! That is why we do the
                 * "ieee80211_input" here, and not some lines up!
                 */
+               RUM_UNLOCK(sc);
                if (m) {
-                       RUM_UNLOCK(sc);
                        ni = ieee80211_find_rxnode(ic,
                            mtod(m, struct ieee80211_frame_min *));
                        if (ni != NULL) {
@@ -941,8 +944,11 @@ tr_setup:
                        } else
                                (void) ieee80211_input_all(ic, m, rssi,
                                    RT2573_NOISE_FLOOR);
-                       RUM_LOCK(sc);
                }
+               if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0 &&
+                   !IFQ_IS_EMPTY(&ifp->if_snd))
+                       rum_start(ifp);
+               RUM_LOCK(sc);
                return;
 
        default:                        /* Error */

Modified: stable/8/sys/dev/usb/wlan/if_uath.c
==============================================================================
--- stable/8/sys/dev/usb/wlan/if_uath.c Tue Oct 20 17:50:27 2009        
(r198299)
+++ stable/8/sys/dev/usb/wlan/if_uath.c Tue Oct 20 17:50:36 2009        
(r198300)
@@ -2762,6 +2762,9 @@ setup:
                        m = NULL;
                        desc = NULL;
                }
+               if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0 &&
+                   !IFQ_IS_EMPTY(&ifp->if_snd))
+                       uath_start(ifp);
                UATH_LOCK(sc);
                break;
        default:

Modified: stable/8/sys/dev/usb/wlan/if_upgt.c
==============================================================================
--- stable/8/sys/dev/usb/wlan/if_upgt.c Tue Oct 20 17:50:27 2009        
(r198299)
+++ stable/8/sys/dev/usb/wlan/if_upgt.c Tue Oct 20 17:50:36 2009        
(r198300)
@@ -2293,6 +2293,9 @@ setup:
                                (void) ieee80211_input_all(ic, m, rssi, nf);
                        m = NULL;
                }
+               if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0 &&
+                   !IFQ_IS_EMPTY(&ifp->if_snd))
+                       upgt_start(ifp);
                UPGT_LOCK(sc);
                break;
        default:

Modified: stable/8/sys/dev/usb/wlan/if_ural.c
==============================================================================
--- stable/8/sys/dev/usb/wlan/if_ural.c Tue Oct 20 17:50:27 2009        
(r198299)
+++ stable/8/sys/dev/usb/wlan/if_ural.c Tue Oct 20 17:50:36 2009        
(r198300)
@@ -837,6 +837,9 @@ tr_setup:
 
                        usbd_transfer_submit(xfer);
                }
+               RAL_UNLOCK(sc);
+               ural_start(ifp);
+               RAL_LOCK(sc);
                break;
 
        default:                        /* Error */
@@ -945,8 +948,8 @@ tr_setup:
                 * the private mutex of a device! That is why we do the
                 * "ieee80211_input" here, and not some lines up!
                 */
+               RAL_UNLOCK(sc);
                if (m) {
-                       RAL_UNLOCK(sc);
                        ni = ieee80211_find_rxnode(ic,
                            mtod(m, struct ieee80211_frame_min *));
                        if (ni != NULL) {
@@ -954,8 +957,11 @@ tr_setup:
                                ieee80211_free_node(ni);
                        } else
                                (void) ieee80211_input_all(ic, m, rssi, nf);
-                       RAL_LOCK(sc);
                }
+               if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0 &&
+                   !IFQ_IS_EMPTY(&ifp->if_snd))
+                       ural_start(ifp);
+               RAL_LOCK(sc);
                return;
 
        default:                        /* Error */

Modified: stable/8/sys/dev/usb/wlan/if_urtw.c
==============================================================================
--- stable/8/sys/dev/usb/wlan/if_urtw.c Tue Oct 20 17:50:27 2009        
(r198299)
+++ stable/8/sys/dev/usb/wlan/if_urtw.c Tue Oct 20 17:50:36 2009        
(r198300)
@@ -4071,6 +4071,9 @@ setup:
                                (void) ieee80211_input_all(ic, m, rssi, nf);
                        m = NULL;
                }
+               if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0 &&
+                   !IFQ_IS_EMPTY(&ifp->if_snd))
+                       urtw_start(ifp);
                URTW_LOCK(sc);
                break;
        default:

Modified: stable/8/sys/dev/usb/wlan/if_zyd.c
==============================================================================
--- stable/8/sys/dev/usb/wlan/if_zyd.c  Tue Oct 20 17:50:27 2009        
(r198299)
+++ stable/8/sys/dev/usb/wlan/if_zyd.c  Tue Oct 20 17:50:36 2009        
(r198300)
@@ -2322,6 +2322,9 @@ tr_setup:
                        } else
                                (void)ieee80211_input_all(ic, m, rssi, nf);
                }
+               if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0 &&
+                   !IFQ_IS_EMPTY(&ifp->if_snd))
+                       zyd_start(ifp);
                ZYD_LOCK(sc);
                break;
 
@@ -2431,6 +2434,9 @@ tr_setup:
                        usbd_xfer_set_priv(xfer, data);
                        usbd_transfer_submit(xfer);
                }
+               ZYD_UNLOCK(sc);
+               zyd_start(ifp);
+               ZYD_LOCK(sc);
                break;
 
        default:                        /* Error */
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to