aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/drivers/net_kern.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/drivers/net_kern.c')
-rw-r--r--arch/um/drivers/net_kern.c39
1 files changed, 15 insertions, 24 deletions
diff --git a/arch/um/drivers/net_kern.c b/arch/um/drivers/net_kern.c
index 501f95675d89..664c2e2fb820 100644
--- a/arch/um/drivers/net_kern.c
+++ b/arch/um/drivers/net_kern.c
@@ -31,6 +31,11 @@
31#include "irq_user.h" 31#include "irq_user.h"
32#include "irq_kern.h" 32#include "irq_kern.h"
33 33
34static inline void set_ether_mac(struct net_device *dev, unsigned char *addr)
35{
36 memcpy(dev->dev_addr, addr, ETH_ALEN);
37}
38
34#define DRIVER_NAME "uml-netdev" 39#define DRIVER_NAME "uml-netdev"
35 40
36static DEFINE_SPINLOCK(opened_lock); 41static DEFINE_SPINLOCK(opened_lock);
@@ -109,8 +114,6 @@ static int uml_net_open(struct net_device *dev)
109 struct uml_net_private *lp = dev->priv; 114 struct uml_net_private *lp = dev->priv;
110 int err; 115 int err;
111 116
112 spin_lock(&lp->lock);
113
114 if(lp->fd >= 0){ 117 if(lp->fd >= 0){
115 err = -ENXIO; 118 err = -ENXIO;
116 goto out; 119 goto out;
@@ -144,8 +147,6 @@ static int uml_net_open(struct net_device *dev)
144 */ 147 */
145 while((err = uml_net_rx(dev)) > 0) ; 148 while((err = uml_net_rx(dev)) > 0) ;
146 149
147 spin_unlock(&lp->lock);
148
149 spin_lock(&opened_lock); 150 spin_lock(&opened_lock);
150 list_add(&lp->list, &opened); 151 list_add(&lp->list, &opened);
151 spin_unlock(&opened_lock); 152 spin_unlock(&opened_lock);
@@ -155,7 +156,6 @@ out_close:
155 if(lp->close != NULL) (*lp->close)(lp->fd, &lp->user); 156 if(lp->close != NULL) (*lp->close)(lp->fd, &lp->user);
156 lp->fd = -1; 157 lp->fd = -1;
157out: 158out:
158 spin_unlock(&lp->lock);
159 return err; 159 return err;
160} 160}
161 161
@@ -164,15 +164,12 @@ static int uml_net_close(struct net_device *dev)
164 struct uml_net_private *lp = dev->priv; 164 struct uml_net_private *lp = dev->priv;
165 165
166 netif_stop_queue(dev); 166 netif_stop_queue(dev);
167 spin_lock(&lp->lock);
168 167
169 free_irq(dev->irq, dev); 168 free_irq(dev->irq, dev);
170 if(lp->close != NULL) 169 if(lp->close != NULL)
171 (*lp->close)(lp->fd, &lp->user); 170 (*lp->close)(lp->fd, &lp->user);
172 lp->fd = -1; 171 lp->fd = -1;
173 172
174 spin_unlock(&lp->lock);
175
176 spin_lock(&opened_lock); 173 spin_lock(&opened_lock);
177 list_del(&lp->list); 174 list_del(&lp->list);
178 spin_unlock(&opened_lock); 175 spin_unlock(&opened_lock);
@@ -241,9 +238,9 @@ static int uml_net_set_mac(struct net_device *dev, void *addr)
241 struct uml_net_private *lp = dev->priv; 238 struct uml_net_private *lp = dev->priv;
242 struct sockaddr *hwaddr = addr; 239 struct sockaddr *hwaddr = addr;
243 240
244 spin_lock(&lp->lock); 241 spin_lock_irq(&lp->lock);
245 memcpy(dev->dev_addr, hwaddr->sa_data, ETH_ALEN); 242 set_ether_mac(dev, hwaddr->sa_data);
246 spin_unlock(&lp->lock); 243 spin_unlock_irq(&lp->lock);
247 244
248 return(0); 245 return(0);
249} 246}
@@ -253,7 +250,7 @@ static int uml_net_change_mtu(struct net_device *dev, int new_mtu)
253 struct uml_net_private *lp = dev->priv; 250 struct uml_net_private *lp = dev->priv;
254 int err = 0; 251 int err = 0;
255 252
256 spin_lock(&lp->lock); 253 spin_lock_irq(&lp->lock);
257 254
258 new_mtu = (*lp->set_mtu)(new_mtu, &lp->user); 255 new_mtu = (*lp->set_mtu)(new_mtu, &lp->user);
259 if(new_mtu < 0){ 256 if(new_mtu < 0){
@@ -264,7 +261,7 @@ static int uml_net_change_mtu(struct net_device *dev, int new_mtu)
264 dev->mtu = new_mtu; 261 dev->mtu = new_mtu;
265 262
266 out: 263 out:
267 spin_unlock(&lp->lock); 264 spin_unlock_irq(&lp->lock);
268 return err; 265 return err;
269} 266}
270 267
@@ -564,12 +561,13 @@ static int eth_setup(char *str)
564 int n, err; 561 int n, err;
565 562
566 err = eth_parse(str, &n, &str); 563 err = eth_parse(str, &n, &str);
567 if(err) return(1); 564 if(err)
565 return 1;
568 566
569 new = alloc_bootmem(sizeof(new)); 567 new = alloc_bootmem(sizeof(*new));
570 if (new == NULL){ 568 if (new == NULL){
571 printk("eth_init : alloc_bootmem failed\n"); 569 printk("eth_init : alloc_bootmem failed\n");
572 return(1); 570 return 1;
573 } 571 }
574 572
575 INIT_LIST_HEAD(&new->list); 573 INIT_LIST_HEAD(&new->list);
@@ -577,7 +575,7 @@ static int eth_setup(char *str)
577 new->init = str; 575 new->init = str;
578 576
579 list_add_tail(&new->list, &eth_cmd_line); 577 list_add_tail(&new->list, &eth_cmd_line);
580 return(1); 578 return 1;
581} 579}
582 580
583__setup("eth", eth_setup); 581__setup("eth", eth_setup);
@@ -790,13 +788,6 @@ void dev_ip_addr(void *d, unsigned char *bin_buf)
790 memcpy(bin_buf, &in->ifa_address, sizeof(in->ifa_address)); 788 memcpy(bin_buf, &in->ifa_address, sizeof(in->ifa_address));
791} 789}
792 790
793void set_ether_mac(void *d, unsigned char *addr)
794{
795 struct net_device *dev = d;
796
797 memcpy(dev->dev_addr, addr, ETH_ALEN);
798}
799
800struct sk_buff *ether_adjust_skb(struct sk_buff *skb, int extra) 791struct sk_buff *ether_adjust_skb(struct sk_buff *skb, int extra)
801{ 792{
802 if((skb != NULL) && (skb_tailroom(skb) < extra)){ 793 if((skb != NULL) && (skb_tailroom(skb) < extra)){