Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/net/can/af_can.c (Version 2.6.25) and /linux/net/can/af_can.c (Version 2.6.11.8)


  1 /*                                                  1 
  2  * af_can.c - Protocol family CAN core module     
  3  *            (used by different CAN protocol     
  4  *                                                
  5  * Copyright (c) 2002-2007 Volkswagen Group El    
  6  * All rights reserved.                           
  7  *                                                
  8  * Redistribution and use in source and binary    
  9  * modification, are permitted provided that t    
 10  * are met:                                       
 11  * 1. Redistributions of source code must reta    
 12  *    notice, this list of conditions and the     
 13  * 2. Redistributions in binary form must repr    
 14  *    notice, this list of conditions and the     
 15  *    documentation and/or other materials pro    
 16  * 3. Neither the name of Volkswagen nor the n    
 17  *    may be used to endorse or promote produc    
 18  *    without specific prior written permissio    
 19  *                                                
 20  * Alternatively, provided that this notice is    
 21  * software may be distributed under the terms    
 22  * Public License ("GPL") version 2, in which     
 23  * GPL apply INSTEAD OF those given above.        
 24  *                                                
 25  * The provided data structures and external i    
 26  * are not restricted to be used by modules wi    
 27  *                                                
 28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT     
 29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTI    
 30  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCH    
 31  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO     
 32  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIR    
 33  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGE    
 34  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS    
 35  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION)    
 36  * THEORY OF LIABILITY, WHETHER IN CONTRACT, S    
 37  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING    
 38  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE PO    
 39  * DAMAGE.                                        
 40  *                                                
 41  * Send feedback to <socketcan-users@lists.ber    
 42  *                                                
 43  */                                               
 44                                                   
 45 #include <linux/module.h>                         
 46 #include <linux/init.h>                           
 47 #include <linux/kmod.h>                           
 48 #include <linux/slab.h>                           
 49 #include <linux/list.h>                           
 50 #include <linux/spinlock.h>                       
 51 #include <linux/rcupdate.h>                       
 52 #include <linux/uaccess.h>                        
 53 #include <linux/net.h>                            
 54 #include <linux/netdevice.h>                      
 55 #include <linux/socket.h>                         
 56 #include <linux/if_ether.h>                       
 57 #include <linux/if_arp.h>                         
 58 #include <linux/skbuff.h>                         
 59 #include <linux/can.h>                            
 60 #include <linux/can/core.h>                       
 61 #include <net/net_namespace.h>                    
 62 #include <net/sock.h>                             
 63                                                   
 64 #include "af_can.h"                               
 65                                                   
 66 static __initdata const char banner[] = KERN_I    
 67         "can: controller area network core ("     
 68                                                   
 69 MODULE_DESCRIPTION("Controller Area Network PF    
 70 MODULE_LICENSE("Dual BSD/GPL");                   
 71 MODULE_AUTHOR("Urs Thuermann <urs.thuermann@vo    
 72               "Oliver Hartkopp <oliver.hartkop    
 73                                                   
 74 MODULE_ALIAS_NETPROTO(PF_CAN);                    
 75                                                   
 76 static int stats_timer __read_mostly = 1;         
 77 module_param(stats_timer, int, S_IRUGO);          
 78 MODULE_PARM_DESC(stats_timer, "enable timer fo    
 79                                                   
 80 HLIST_HEAD(can_rx_dev_list);                      
 81 static struct dev_rcv_lists can_rx_alldev_list    
 82 static DEFINE_SPINLOCK(can_rcvlists_lock);        
 83                                                   
 84 static struct kmem_cache *rcv_cache __read_mos    
 85                                                   
 86 /* table of registered CAN protocols */           
 87 static struct can_proto *proto_tab[CAN_NPROTO]    
 88 static DEFINE_SPINLOCK(proto_tab_lock);           
 89                                                   
 90 struct timer_list can_stattimer;   /* timer fo    
 91 struct s_stats    can_stats;       /* packet s    
 92 struct s_pstats   can_pstats;      /* receive     
 93                                                   
 94 /*                                                
 95  * af_can socket functions                        
 96  */                                               
 97                                                   
 98 static int can_ioctl(struct socket *sock, unsi    
 99 {                                                 
100         struct sock *sk = sock->sk;               
101                                                   
102         switch (cmd) {                            
103                                                   
104         case SIOCGSTAMP:                          
105                 return sock_get_timestamp(sk,     
106                                                   
107         default:                                  
108                 return -ENOIOCTLCMD;              
109         }                                         
110 }                                                 
111                                                   
112 static void can_sock_destruct(struct sock *sk)    
113 {                                                 
114         skb_queue_purge(&sk->sk_receive_queue)    
115 }                                                 
116                                                   
117 static int can_create(struct net *net, struct     
118 {                                                 
119         struct sock *sk;                          
120         struct can_proto *cp;                     
121         int err = 0;                              
122                                                   
123         sock->state = SS_UNCONNECTED;             
124                                                   
125         if (protocol < 0 || protocol >= CAN_NP    
126                 return -EINVAL;                   
127                                                   
128         if (net != &init_net)                     
129                 return -EAFNOSUPPORT;             
130                                                   
131 #ifdef CONFIG_KMOD                                
132         /* try to load protocol module, when C    
133         if (!proto_tab[protocol]) {               
134                 err = request_module("can-prot    
135                                                   
136                 /*                                
137                  * In case of error we only pr    
138                  * return the error code immed    
139                  * return -EPROTONOSUPPORT        
140                  */                               
141                 if (err && printk_ratelimit())    
142                         printk(KERN_ERR "can:     
143                                "(can-proto-%d)    
144         }                                         
145 #endif                                            
146                                                   
147         spin_lock(&proto_tab_lock);               
148         cp = proto_tab[protocol];                 
149         if (cp && !try_module_get(cp->prot->ow    
150                 cp = NULL;                        
151         spin_unlock(&proto_tab_lock);             
152                                                   
153         /* check for available protocol and co    
154                                                   
155         if (!cp)                                  
156                 return -EPROTONOSUPPORT;          
157                                                   
158         if (cp->type != sock->type) {             
159                 err = -EPROTONOSUPPORT;           
160                 goto errout;                      
161         }                                         
162                                                   
163         if (cp->capability >= 0 && !capable(cp    
164                 err = -EPERM;                     
165                 goto errout;                      
166         }                                         
167                                                   
168         sock->ops = cp->ops;                      
169                                                   
170         sk = sk_alloc(net, PF_CAN, GFP_KERNEL,    
171         if (!sk) {                                
172                 err = -ENOMEM;                    
173                 goto errout;                      
174         }                                         
175                                                   
176         sock_init_data(sock, sk);                 
177         sk->sk_destruct = can_sock_destruct;      
178                                                   
179         if (sk->sk_prot->init)                    
180                 err = sk->sk_prot->init(sk);      
181                                                   
182         if (err) {                                
183                 /* release sk on errors */        
184                 sock_orphan(sk);                  
185                 sock_put(sk);                     
186         }                                         
187                                                   
188  errout:                                          
189         module_put(cp->prot->owner);              
190         return err;                               
191 }                                                 
192                                                   
193 /*                                                
194  * af_can tx path                                 
195  */                                               
196                                                   
197 /**                                               
198  * can_send - transmit a CAN frame (optional w    
199  * @skb: pointer to socket buffer with CAN fra    
200  * @loop: loopback for listeners on local CAN     
201  *                                                
202  * Return:                                        
203  *  0 on success                                  
204  *  -ENETDOWN when the selected interface is d    
205  *  -ENOBUFS on full driver queue (see net_xmi    
206  *  -ENOMEM when local loopback failed at call    
207  *  -EPERM when trying to send on a non-CAN in    
208  */                                               
209 int can_send(struct sk_buff *skb, int loop)       
210 {                                                 
211         int err;                                  
212                                                   
213         if (skb->dev->type != ARPHRD_CAN) {       
214                 kfree_skb(skb);                   
215                 return -EPERM;                    
216         }                                         
217                                                   
218         if (!(skb->dev->flags & IFF_UP)) {        
219                 kfree_skb(skb);                   
220                 return -ENETDOWN;                 
221         }                                         
222                                                   
223         skb->protocol = htons(ETH_P_CAN);         
224         skb_reset_network_header(skb);            
225         skb_reset_transport_header(skb);          
226                                                   
227         if (loop) {                               
228                 /* local loopback of sent CAN     
229                                                   
230                 /* indication for the CAN driv    
231                 skb->pkt_type = PACKET_LOOPBAC    
232                                                   
233                 /*                                
234                  * The reference to the origin    
235                  * by the receiving socket to     
236                  * its own. Example: can_raw s    
237                  * Therefore we have to ensure    
238                  * reference to the originatin    
239                  * after each skb_clone() or s    
240                  */                               
241                                                   
242                 if (!(skb->dev->flags & IFF_EC    
243                         /*                        
244                          * If the interface is    
245                          * itself, we do it he    
246                          */                       
247                         struct sk_buff *newskb    
248                                                   
249                         if (!newskb) {            
250                                 kfree_skb(skb)    
251                                 return -ENOMEM    
252                         }                         
253                                                   
254                         newskb->sk = skb->sk;     
255                         newskb->ip_summed = CH    
256                         newskb->pkt_type = PAC    
257                         netif_rx(newskb);         
258                 }                                 
259         } else {                                  
260                 /* indication for the CAN driv    
261                 skb->pkt_type = PACKET_HOST;      
262         }                                         
263                                                   
264         /* send to netdevice */                   
265         err = dev_queue_xmit(skb);                
266         if (err > 0)                              
267                 err = net_xmit_errno(err);        
268                                                   
269         /* update statistics */                   
270         can_stats.tx_frames++;                    
271         can_stats.tx_frames_delta++;              
272                                                   
273         return err;                               
274 }                                                 
275 EXPORT_SYMBOL(can_send);                          
276                                                   
277 /*                                                
278  * af_can rx path                                 
279  */                                               
280                                                   
281 static struct dev_rcv_lists *find_dev_rcv_list    
282 {                                                 
283         struct dev_rcv_lists *d = NULL;           
284         struct hlist_node *n;                     
285                                                   
286         /*                                        
287          * find receive list for this device      
288          *                                        
289          * The hlist_for_each_entry*() macros     
290          * using the pointer variable n and se    
291          * struct in each list iteration.  The    
292          * iteration, d is unmodified when the    
293          * points to last list element, when t    
294          * but no match in the loop body is fo    
295          * NULL when no match is found.  We ca    
296          * cursor variable n to decide if a ma    
297          */                                       
298                                                   
299         hlist_for_each_entry_rcu(d, n, &can_rx    
300                 if (d->dev == dev)                
301                         break;                    
302         }                                         
303                                                   
304         return n ? d : NULL;                      
305 }                                                 
306                                                   
307 static struct hlist_head *find_rcv_list(canid_    
308                                         struct    
309 {                                                 
310         canid_t inv = *can_id & CAN_INV_FILTER    
311                                                   
312         /* filter error frames */                 
313         if (*mask & CAN_ERR_FLAG) {               
314                 /* clear CAN_ERR_FLAG in list     
315                 *mask &= CAN_ERR_MASK;            
316                 return &d->rx[RX_ERR];            
317         }                                         
318                                                   
319         /* ensure valid values in can_mask */     
320         if (*mask & CAN_EFF_FLAG)                 
321                 *mask &= (CAN_EFF_MASK | CAN_E    
322         else                                      
323                 *mask &= (CAN_SFF_MASK | CAN_R    
324                                                   
325         /* reduce condition testing at receive    
326         *can_id &= *mask;                         
327                                                   
328         /* inverse can_id/can_mask filter */      
329         if (inv)                                  
330                 return &d->rx[RX_INV];            
331                                                   
332         /* mask == 0 => no condition testing a    
333         if (!(*mask))                             
334                 return &d->rx[RX_ALL];            
335                                                   
336         /* use extra filterset for the subscri    
337         if (*can_id & CAN_EFF_FLAG) {             
338                 if (*mask == (CAN_EFF_MASK | C    
339                         /* RFC: a use-case for    
340                         return &d->rx[RX_EFF];    
341                 }                                 
342         } else {                                  
343                 if (*mask == CAN_SFF_MASK)        
344                         return &d->rx_sff[*can    
345         }                                         
346                                                   
347         /* default: filter via can_id/can_mask    
348         return &d->rx[RX_FIL];                    
349 }                                                 
350                                                   
351 /**                                               
352  * can_rx_register - subscribe CAN frames from    
353  * @dev: pointer to netdevice (NULL => subcrib    
354  * @can_id: CAN identifier (see description)      
355  * @mask: CAN mask (see description)              
356  * @func: callback function on filter match       
357  * @data: returned parameter for callback func    
358  * @ident: string for calling module indentifi    
359  *                                                
360  * Description:                                   
361  *  Invokes the callback function with the rec    
362  *  parameter 'data' on a matching receive fil    
363  *                                                
364  *          <received_can_id> & mask == can_id    
365  *                                                
366  *  The filter can be inverted (CAN_INV_FILTER    
367  *  filter for error frames (CAN_ERR_FLAG bit     
368  *                                                
369  * Return:                                        
370  *  0 on success                                  
371  *  -ENOMEM on missing cache mem to create sub    
372  *  -ENODEV unknown device                        
373  */                                               
374 int can_rx_register(struct net_device *dev, ca    
375                     void (*func)(struct sk_buf    
376                     char *ident)                  
377 {                                                 
378         struct receiver *r;                       
379         struct hlist_head *rl;                    
380         struct dev_rcv_lists *d;                  
381         int err = 0;                              
382                                                   
383         /* insert new receiver  (dev,canid,mas    
384                                                   
385         r = kmem_cache_alloc(rcv_cache, GFP_KE    
386         if (!r)                                   
387                 return -ENOMEM;                   
388                                                   
389         spin_lock(&can_rcvlists_lock);            
390                                                   
391         d = find_dev_rcv_lists(dev);              
392         if (d) {                                  
393                 rl = find_rcv_list(&can_id, &m    
394                                                   
395                 r->can_id  = can_id;              
396                 r->mask    = mask;                
397                 r->matches = 0;                   
398                 r->func    = func;                
399                 r->data    = data;                
400                 r->ident   = ident;               
401                                                   
402                 hlist_add_head_rcu(&r->list, r    
403                 d->entries++;                     
404                                                   
405                 can_pstats.rcv_entries++;         
406                 if (can_pstats.rcv_entries_max    
407                         can_pstats.rcv_entries    
408         } else {                                  
409                 kmem_cache_free(rcv_cache, r);    
410                 err = -ENODEV;                    
411         }                                         
412                                                   
413         spin_unlock(&can_rcvlists_lock);          
414                                                   
415         return err;                               
416 }                                                 
417 EXPORT_SYMBOL(can_rx_register);                   
418                                                   
419 /*                                                
420  * can_rx_delete_device - rcu callback for dev    
421  */                                               
422 static void can_rx_delete_device(struct rcu_he    
423 {                                                 
424         struct dev_rcv_lists *d = container_of    
425                                                   
426         kfree(d);                                 
427 }                                                 
428                                                   
429 /*                                                
430  * can_rx_delete_receiver - rcu callback for s    
431  */                                               
432 static void can_rx_delete_receiver(struct rcu_    
433 {                                                 
434         struct receiver *r = container_of(rp,     
435                                                   
436         kmem_cache_free(rcv_cache, r);            
437 }                                                 
438                                                   
439 /**                                               
440  * can_rx_unregister - unsubscribe CAN frames     
441  * @dev: pointer to netdevice (NULL => unsubcr    
442  * @can_id: CAN identifier                        
443  * @mask: CAN mask                                
444  * @func: callback function on filter match       
445  * @data: returned parameter for callback func    
446  *                                                
447  * Description:                                   
448  *  Removes subscription entry depending on gi    
449  */                                               
450 void can_rx_unregister(struct net_device *dev,    
451                        void (*func)(struct sk_    
452 {                                                 
453         struct receiver *r = NULL;                
454         struct hlist_head *rl;                    
455         struct hlist_node *next;                  
456         struct dev_rcv_lists *d;                  
457                                                   
458         spin_lock(&can_rcvlists_lock);            
459                                                   
460         d = find_dev_rcv_lists(dev);              
461         if (!d) {                                 
462                 printk(KERN_ERR "BUG: receive     
463                        "dev %s, id %03X, mask     
464                        DNAME(dev), can_id, mas    
465                 goto out;                         
466         }                                         
467                                                   
468         rl = find_rcv_list(&can_id, &mask, d);    
469                                                   
470         /*                                        
471          * Search the receiver list for the it    
472          * exist, since no receiver may be unr    
473          * been registered before.                
474          */                                       
475                                                   
476         hlist_for_each_entry_rcu(r, next, rl,     
477                 if (r->can_id == can_id && r->    
478                     && r->func == func && r->d    
479                         break;                    
480         }                                         
481                                                   
482         /*                                        
483          * Check for bugs in CAN protocol impl    
484          * If no matching list item was found,    
485          * will be NULL, while r will point to    
486          */                                       
487                                                   
488         if (!next) {                              
489                 printk(KERN_ERR "BUG: receive     
490                        "dev %s, id %03X, mask     
491                        DNAME(dev), can_id, mas    
492                 r = NULL;                         
493                 d = NULL;                         
494                 goto out;                         
495         }                                         
496                                                   
497         hlist_del_rcu(&r->list);                  
498         d->entries--;                             
499                                                   
500         if (can_pstats.rcv_entries > 0)           
501                 can_pstats.rcv_entries--;         
502                                                   
503         /* remove device structure requested b    
504         if (d->remove_on_zero_entries && !d->e    
505                 hlist_del_rcu(&d->list);          
506         else                                      
507                 d = NULL;                         
508                                                   
509  out:                                             
510         spin_unlock(&can_rcvlists_lock);          
511                                                   
512         /* schedule the receiver item for dele    
513         if (r)                                    
514                 call_rcu(&r->rcu, can_rx_delet    
515                                                   
516         /* schedule the device structure for d    
517         if (d)                                    
518                 call_rcu(&d->rcu, can_rx_delet    
519 }                                                 
520 EXPORT_SYMBOL(can_rx_unregister);                 
521                                                   
522 static inline void deliver(struct sk_buff *skb    
523 {                                                 
524         struct sk_buff *clone = skb_clone(skb,    
525                                                   
526         if (clone) {                              
527                 clone->sk = skb->sk;              
528                 r->func(clone, r->data);          
529                 r->matches++;                     
530         }                                         
531 }                                                 
532                                                   
533 static int can_rcv_filter(struct dev_rcv_lists    
534 {                                                 
535         struct receiver *r;                       
536         struct hlist_node *n;                     
537         int matches = 0;                          
538         struct can_frame *cf = (struct can_fra    
539         canid_t can_id = cf->can_id;              
540                                                   
541         if (d->entries == 0)                      
542                 return 0;                         
543                                                   
544         if (can_id & CAN_ERR_FLAG) {              
545                 /* check for error frame entri    
546                 hlist_for_each_entry_rcu(r, n,    
547                         if (can_id & r->mask)     
548                                 deliver(skb, r    
549                                 matches++;        
550                         }                         
551                 }                                 
552                 return matches;                   
553         }                                         
554                                                   
555         /* check for unfiltered entries */        
556         hlist_for_each_entry_rcu(r, n, &d->rx[    
557                 deliver(skb, r);                  
558                 matches++;                        
559         }                                         
560                                                   
561         /* check for can_id/mask entries */       
562         hlist_for_each_entry_rcu(r, n, &d->rx[    
563                 if ((can_id & r->mask) == r->c    
564                         deliver(skb, r);          
565                         matches++;                
566                 }                                 
567         }                                         
568                                                   
569         /* check for inverted can_id/mask entr    
570         hlist_for_each_entry_rcu(r, n, &d->rx[    
571                 if ((can_id & r->mask) != r->c    
572                         deliver(skb, r);          
573                         matches++;                
574                 }                                 
575         }                                         
576                                                   
577         /* check CAN_ID specific entries */       
578         if (can_id & CAN_EFF_FLAG) {              
579                 hlist_for_each_entry_rcu(r, n,    
580                         if (r->can_id == can_i    
581                                 deliver(skb, r    
582                                 matches++;        
583                         }                         
584                 }                                 
585         } else {                                  
586                 can_id &= CAN_SFF_MASK;           
587                 hlist_for_each_entry_rcu(r, n,    
588                         deliver(skb, r);          
589                         matches++;                
590                 }                                 
591         }                                         
592                                                   
593         return matches;                           
594 }                                                 
595                                                   
596 static int can_rcv(struct sk_buff *skb, struct    
597                    struct packet_type *pt, str    
598 {                                                 
599         struct dev_rcv_lists *d;                  
600         int matches;                              
601                                                   
602         if (dev->type != ARPHRD_CAN || dev->nd    
603                 kfree_skb(skb);                   
604                 return 0;                         
605         }                                         
606                                                   
607         /* update statistics */                   
608         can_stats.rx_frames++;                    
609         can_stats.rx_frames_delta++;              
610                                                   
611         rcu_read_lock();                          
612                                                   
613         /* deliver the packet to sockets liste    
614         matches = can_rcv_filter(&can_rx_allde    
615                                                   
616         /* find receive list for this device *    
617         d = find_dev_rcv_lists(dev);              
618         if (d)                                    
619                 matches += can_rcv_filter(d, s    
620                                                   
621         rcu_read_unlock();                        
622                                                   
623         /* free the skbuff allocated by the ne    
624         kfree_skb(skb);                           
625                                                   
626         if (matches > 0) {                        
627                 can_stats.matches++;              
628                 can_stats.matches_delta++;        
629         }                                         
630                                                   
631         return 0;                                 
632 }                                                 
633                                                   
634 /*                                                
635  * af_can protocol functions                      
636  */                                               
637                                                   
638 /**                                               
639  * can_proto_register - register CAN transport    
640  * @cp: pointer to CAN protocol structure         
641  *                                                
642  * Return:                                        
643  *  0 on success                                  
644  *  -EINVAL invalid (out of range) protocol nu    
645  *  -EBUSY  protocol already in use               
646  *  -ENOBUF if proto_register() fails             
647  */                                               
648 int can_proto_register(struct can_proto *cp)      
649 {                                                 
650         int proto = cp->protocol;                 
651         int err = 0;                              
652                                                   
653         if (proto < 0 || proto >= CAN_NPROTO)     
654                 printk(KERN_ERR "can: protocol    
655                        proto);                    
656                 return -EINVAL;                   
657         }                                         
658                                                   
659         err = proto_register(cp->prot, 0);        
660         if (err < 0)                              
661                 return err;                       
662                                                   
663         spin_lock(&proto_tab_lock);               
664         if (proto_tab[proto]) {                   
665                 printk(KERN_ERR "can: protocol    
666                        proto);                    
667                 err = -EBUSY;                     
668         } else {                                  
669                 proto_tab[proto] = cp;            
670                                                   
671                 /* use generic ioctl function     
672                 if (!cp->ops->ioctl)              
673                         cp->ops->ioctl = can_i    
674         }                                         
675         spin_unlock(&proto_tab_lock);             
676                                                   
677         if (err < 0)                              
678                 proto_unregister(cp->prot);       
679                                                   
680         return err;                               
681 }                                                 
682 EXPORT_SYMBOL(can_proto_register);                
683                                                   
684 /**                                               
685  * can_proto_unregister - unregister CAN trans    
686  * @cp: pointer to CAN protocol structure         
687  */                                               
688 void can_proto_unregister(struct can_proto *cp    
689 {                                                 
690         int proto = cp->protocol;                 
691                                                   
692         spin_lock(&proto_tab_lock);               
693         if (!proto_tab[proto]) {                  
694                 printk(KERN_ERR "BUG: can: pro    
695                        proto);                    
696         }                                         
697         proto_tab[proto] = NULL;                  
698         spin_unlock(&proto_tab_lock);             
699                                                   
700         proto_unregister(cp->prot);               
701 }                                                 
702 EXPORT_SYMBOL(can_proto_unregister);              
703                                                   
704 /*                                                
705  * af_can notifier to create/remove CAN netdev    
706  */                                               
707 static int can_notifier(struct notifier_block     
708                         void *data)               
709 {                                                 
710         struct net_device *dev = (struct net_d    
711         struct dev_rcv_lists *d;                  
712                                                   
713         if (dev->nd_net != &init_net)             
714                 return NOTIFY_DONE;               
715                                                   
716         if (dev->type != ARPHRD_CAN)              
717                 return NOTIFY_DONE;               
718                                                   
719         switch (msg) {                            
720                                                   
721         case NETDEV_REGISTER:                     
722                                                   
723                 /*                                
724                  * create new dev_rcv_lists fo    
725                  *                                
726                  * N.B. zeroing the struct is     
727                  * for the embedded hlist_head    
728                  * Another list type, e.g. lis    
729                  * explicit initialization.       
730                  */                               
731                                                   
732                 d = kzalloc(sizeof(*d), GFP_KE    
733                 if (!d) {                         
734                         printk(KERN_ERR           
735                                "can: allocatio    
736                         return NOTIFY_DONE;       
737                 }                                 
738                 d->dev = dev;                     
739                                                   
740                 spin_lock(&can_rcvlists_lock);    
741                 hlist_add_head_rcu(&d->list, &    
742                 spin_unlock(&can_rcvlists_lock    
743                                                   
744                 break;                            
745                                                   
746         case NETDEV_UNREGISTER:                   
747                 spin_lock(&can_rcvlists_lock);    
748                                                   
749                 d = find_dev_rcv_lists(dev);      
750                 if (d) {                          
751                         if (d->entries) {         
752                                 d->remove_on_z    
753                                 d = NULL;         
754                         } else                    
755                                 hlist_del_rcu(    
756                 } else                            
757                         printk(KERN_ERR "can:     
758                                "found for dev     
759                                                   
760                 spin_unlock(&can_rcvlists_lock    
761                                                   
762                 if (d)                            
763                         call_rcu(&d->rcu, can_    
764                                                   
765                 break;                            
766         }                                         
767                                                   
768         return NOTIFY_DONE;                       
769 }                                                 
770                                                   
771 /*                                                
772  * af_can module init/exit functions              
773  */                                               
774                                                   
775 static struct packet_type can_packet __read_mo    
776         .type = __constant_htons(ETH_P_CAN),      
777         .dev  = NULL,                             
778         .func = can_rcv,                          
779 };                                                
780                                                   
781 static struct net_proto_family can_family_ops     
782         .family = PF_CAN,                         
783         .create = can_create,                     
784         .owner  = THIS_MODULE,                    
785 };                                                
786                                                   
787 /* notifier block for netdevice event */          
788 static struct notifier_block can_netdev_notifi    
789         .notifier_call = can_notifier,            
790 };                                                
791                                                   
792 static __init int can_init(void)                  
793 {                                                 
794         printk(banner);                           
795                                                   
796         rcv_cache = kmem_cache_create("can_rec    
797                                       0, 0, NU    
798         if (!rcv_cache)                           
799                 return -ENOMEM;                   
800                                                   
801         /*                                        
802          * Insert can_rx_alldev_list for recep    
803          * This struct is zero initialized whi    
804          * embedded hlist heads, the dev point    
805          */                                       
806                                                   
807         spin_lock(&can_rcvlists_lock);            
808         hlist_add_head_rcu(&can_rx_alldev_list    
809         spin_unlock(&can_rcvlists_lock);          
810                                                   
811         if (stats_timer) {                        
812                 /* the statistics are updated     
813                 setup_timer(&can_stattimer, ca    
814                 mod_timer(&can_stattimer, roun    
815         } else                                    
816                 can_stattimer.function = NULL;    
817                                                   
818         can_init_proc();                          
819                                                   
820         /* protocol register */                   
821         sock_register(&can_family_ops);           
822         register_netdevice_notifier(&can_netde    
823         dev_add_pack(&can_packet);                
824                                                   
825         return 0;                                 
826 }                                                 
827                                                   
828 static __exit void can_exit(void)                 
829 {                                                 
830         struct dev_rcv_lists *d;                  
831         struct hlist_node *n, *next;              
832                                                   
833         if (stats_timer)                          
834                 del_timer(&can_stattimer);        
835                                                   
836         can_remove_proc();                        
837                                                   
838         /* protocol unregister */                 
839         dev_remove_pack(&can_packet);             
840         unregister_netdevice_notifier(&can_net    
841         sock_unregister(PF_CAN);                  
842                                                   
843         /* remove can_rx_dev_list */              
844         spin_lock(&can_rcvlists_lock);            
845         hlist_del(&can_rx_alldev_list.list);      
846         hlist_for_each_entry_safe(d, n, next,     
847                 hlist_del(&d->list);              
848                 kfree(d);                         
849         }                                         
850         spin_unlock(&can_rcvlists_lock);          
851                                                   
852         kmem_cache_destroy(rcv_cache);            
853 }                                                 
854                                                   
855 module_init(can_init);                            
856 module_exit(can_exit);                            
857                                                   
  This page was automatically generated by the LXR engine.