--- zzzz-none-000/linux-2.6.28.10/net/atm/common.c 2009-05-02 18:54:43.000000000 +0000 +++ puma5-6360-529/linux-2.6.28.10/net/atm/common.c 2011-03-15 14:20:12.000000000 +0000 @@ -30,6 +30,11 @@ #include "addr.h" /* address registry */ #include "signaling.h" /* for WAITING and sigd_attach */ +#ifdef CONFIG_MACH_FUSIV +extern int (*AtmUpdateNewVCInfo_ptr)(int encap, struct atm_vcc *atmvcc, int moduleId, char *ifname); +extern int (*AtmDeleteVCInfo_ptr)(short vpi,int vci); +#endif + struct hlist_head vcc_hash[VCC_HTABLE_SIZE]; DEFINE_RWLOCK(vcc_sklist_lock); @@ -57,11 +62,19 @@ } +#if defined(CONFIG_AMAZON_S_ATM) || defined(CONFIG_AMAZON_S_ATM_MODULE) || defined(CONFIG_IFX_PPA_A5) || defined(CONFIG_IFX_PPA_A4) || defined(CONFIG_ATM_DANUBE) || defined(CONFIG_DANUBE_PPA_A4) + struct sk_buff* (*ifx_atm_alloc_tx)(struct atm_vcc *, unsigned int) = NULL; + EXPORT_SYMBOL(ifx_atm_alloc_tx); +#endif static struct sk_buff *alloc_tx(struct atm_vcc *vcc,unsigned int size) { struct sk_buff *skb; struct sock *sk = sk_atm(vcc); +#if defined(CONFIG_AMAZON_S_ATM) || defined(CONFIG_IFX_PPA_A5) || defined(CONFIG_IFX_PPA_A4) || defined(CONFIG_ATM_DANUBE) || defined(CONFIG_DANUBE_PPA_A4) + if (ifx_atm_alloc_tx) + return ifx_atm_alloc_tx(vcc, size); +#endif if (atomic_read(&sk->sk_wmem_alloc) && !atm_may_send(vcc, size)) { pr_debug("Sorry: wmem_alloc = %d, size = %d, sndbuf = %d\n", atomic_read(&sk->sk_wmem_alloc), size, @@ -124,6 +137,20 @@ .owner = THIS_MODULE, .obj_size = sizeof(struct atm_vcc), }; + +#ifdef CONFIG_IFX_OAM +int (*ifx_push_oam_pfn)(struct atm_vcc *atmvcc, void *cell) = NULL; +EXPORT_SYMBOL(ifx_push_oam_pfn); + +int ifx_push_oam(struct atm_vcc *atmvcc, void *cell) +{ + //printk("entering ifx_push_oam\n"); + if (ifx_push_oam_pfn != NULL) + return ifx_push_oam_pfn(atmvcc, cell); + return -1; +} +EXPORT_SYMBOL(ifx_push_oam); +#endif int vcc_create(struct net *net, struct socket *sock, int protocol, int family) { @@ -149,7 +176,11 @@ atomic_set(&sk->sk_rmem_alloc, 0); vcc->push = NULL; vcc->pop = NULL; - vcc->push_oam = NULL; +#ifdef CONFIG_IFX_OAM + vcc->push_oam = ifx_push_oam; +#else + vcc->push_oam = NULL; +#endif vcc->vpi = vcc->vci = 0; /* no VCI/VPI yet */ vcc->atm_options = vcc->aal_options = 0; sk->sk_destruct = vcc_sock_destruct; @@ -165,6 +196,10 @@ set_bit(ATM_VF_CLOSE, &vcc->flags); clear_bit(ATM_VF_READY, &vcc->flags); if (vcc->dev) { +#ifdef CONFIG_MACH_FUSIV + if (AtmDeleteVCInfo_ptr) + (*AtmDeleteVCInfo_ptr)(vcc->vpi, vcc->vci); +#endif if (vcc->dev->ops->close) vcc->dev->ops->close(vcc); if (vcc->push) @@ -178,6 +213,7 @@ module_put(vcc->dev->ops->owner); atm_dev_put(vcc->dev); } + printk(KERN_DEBUG "vcc_release(%d,%d) done.", vcc->vpi, vcc->vci); vcc_remove_socket(sk); } @@ -395,6 +431,12 @@ if ((error = dev->ops->open(vcc))) goto fail; } +#ifdef CONFIG_MACH_FUSIV + if (AtmUpdateNewVCInfo_ptr) + (*AtmUpdateNewVCInfo_ptr)(0, vcc, 0, "atm"); +#endif + printk(KERN_DEBUG "vcc_connect(%d,%d) done.", vcc->vpi, vcc->vci); + return 0; fail: @@ -809,6 +851,11 @@ proto_unregister(&vcc_proto); } +#if defined(CONFIG_IFX_PPA_A5) || defined(CONFIG_IFX_PPA_A4) || defined(CONFIG_DANUBE_PPA_A4) + void (*ppa_hook_mpoa_setup)(struct atm_vcc *, int, int) = NULL; + EXPORT_SYMBOL(ppa_hook_mpoa_setup); +#endif + subsys_initcall(atm_init); module_exit(atm_exit); @@ -816,3 +863,4 @@ MODULE_LICENSE("GPL"); MODULE_ALIAS_NETPROTO(PF_ATMPVC); MODULE_ALIAS_NETPROTO(PF_ATMSVC); +