Phonet: keep TX queue disabled when the device is off

Signed-off-by: Rémi Denis-Courmont <remi.denis-courmont@nokia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Rémi Denis-Courmont and committed by
David S. Miller
4798a2b8 eb9b851b

+22 -5
+22 -5
net/phonet/pep-gprs.c
··· 155 static void gprs_write_space(struct sock *sk) 156 { 157 struct gprs_dev *dev = sk->sk_user_data; 158 unsigned credits = pep_writeable(sk); 159 160 spin_lock_bh(&dev->tx_lock); 161 dev->tx_max = credits; 162 - if (credits > skb_queue_len(&dev->tx_queue)) 163 - netif_wake_queue(dev->net); 164 spin_unlock_bh(&dev->tx_lock); 165 } 166 167 /* 168 * Network device callbacks 169 */ 170 171 static int gprs_xmit(struct sk_buff *skb, struct net_device *net) 172 { ··· 272 net->tx_queue_len = 10; 273 274 net->destructor = free_netdev; 275 net->hard_start_xmit = gprs_xmit; /* mandatory */ 276 net->change_mtu = gprs_set_mtu; 277 net->get_stats = gprs_get_stats; ··· 338 dev->sk = sk; 339 340 printk(KERN_DEBUG"%s: attached\n", net->name); 341 - gprs_write_space(sk); /* kick off TX */ 342 return net->ifindex; 343 344 out_rel: ··· 360 361 printk(KERN_DEBUG"%s: detached\n", net->name); 362 unregister_netdev(net); 363 - flush_scheduled_work(); 364 sock_put(sk); 365 - skb_queue_purge(&dev->tx_queue); 366 }
··· 155 static void gprs_write_space(struct sock *sk) 156 { 157 struct gprs_dev *dev = sk->sk_user_data; 158 + struct net_device *net = dev->net; 159 unsigned credits = pep_writeable(sk); 160 161 spin_lock_bh(&dev->tx_lock); 162 dev->tx_max = credits; 163 + if (credits > skb_queue_len(&dev->tx_queue) && netif_running(net)) 164 + netif_wake_queue(net); 165 spin_unlock_bh(&dev->tx_lock); 166 } 167 168 /* 169 * Network device callbacks 170 */ 171 + 172 + static int gprs_open(struct net_device *dev) 173 + { 174 + struct gprs_dev *gp = netdev_priv(dev); 175 + 176 + gprs_write_space(gp->sk); 177 + return 0; 178 + } 179 + 180 + static int gprs_close(struct net_device *dev) 181 + { 182 + struct gprs_dev *gp = netdev_priv(dev); 183 + 184 + netif_stop_queue(dev); 185 + flush_work(&gp->tx_work); 186 + return 0; 187 + } 188 189 static int gprs_xmit(struct sk_buff *skb, struct net_device *net) 190 { ··· 254 net->tx_queue_len = 10; 255 256 net->destructor = free_netdev; 257 + net->open = gprs_open; 258 + net->stop = gprs_close; 259 net->hard_start_xmit = gprs_xmit; /* mandatory */ 260 net->change_mtu = gprs_set_mtu; 261 net->get_stats = gprs_get_stats; ··· 318 dev->sk = sk; 319 320 printk(KERN_DEBUG"%s: attached\n", net->name); 321 return net->ifindex; 322 323 out_rel: ··· 341 342 printk(KERN_DEBUG"%s: detached\n", net->name); 343 unregister_netdev(net); 344 sock_put(sk); 345 }