--- sangam-atm-1.0.orig/tn7atm.c 2007-05-18 09:45:50.000000000 +0200 +++ sangam-atm-1.0/tn7atm.c 2009-12-17 19:10:27.616421480 +0100 @@ -61,7 +61,6 @@ * UR8_MERGE_END CQ11057* *********************************************************************************************/ -#include #include #include #include @@ -69,11 +68,20 @@ #include #include #include -#include -#include #include #include #include +#include + +#include +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31) +#include +#include +#else +#include +#include +#endif + #include "dsl_hal_api.h" #include "tn7atm.h" #include "tn7api.h" @@ -82,8 +90,149 @@ #include "dsl_hal_register.h" #ifdef MODULE +MODULE_LICENSE("GPL"); MODULE_DESCRIPTION ("Tnetd73xx ATM Device Driver"); MODULE_AUTHOR ("Zhicheng Tang"); + +int mp_sar_ipacemax = -1; +module_param_named(ipacemax, mp_sar_ipacemax, int, 0); +MODULE_PARM_DESC(ipacemax, "Interrupt pacing"); + +char *mp_macc = NULL; +module_param_named(macc, mp_macc, charp, 0); +MODULE_PARM_DESC(macc, "MAC address"); + +int mp_dsp_noboost = -1; +module_param_named(dsp_noboost, mp_dsp_noboost, int, 0); +MODULE_PARM_DESC(dsp_noboost, "Suppress DSP frequency boost"); + +int mp_dsp_freq = -1; +module_param_named(dsp_freq, mp_dsp_freq, int, 0); +MODULE_PARM_DESC(dsp_freq, "Frequency to boost the DSP to"); + +char *mp_featctl0 = NULL; +module_param_named(featctl0, mp_featctl0, charp, 0); +MODULE_PARM_DESC(featctl0, "DSL feature control 0"); + +char *mp_featctl1 = NULL; +module_param_named(featctl1, mp_featctl1, charp, 0); +MODULE_PARM_DESC(featctl1, "DSL feature control 1"); + +char *mp_phyctl0 = NULL; +module_param_named(phyctl0, mp_phyctl0, charp, 0); +MODULE_PARM_DESC(phyctl0, "DSL PHY control 0"); + +char *mp_phyctl1 = NULL; +module_param_named(phyctl1, mp_phyctl1, charp, 0); +MODULE_PARM_DESC(phyctl1, "DSL PHY control 1"); + +int mp_turbodsl = -1; +module_param_named(turbodsl, mp_turbodsl, int, 0); +MODULE_PARM_DESC(turbodsl, "Enable TurboDSL"); + +int mp_sar_rxbuf = -1; +module_param_named(sar_rxbuf, mp_sar_rxbuf, int, 0); +MODULE_PARM_DESC(sar_rxbuf, "SAR RxBuf size"); + +int mp_sar_rxmax = -1; +module_param_named(sar_rxmax, mp_sar_rxmax, int, 0); +MODULE_PARM_DESC(sar_rxmax, "SAR RxMax size"); + +int mp_sar_txbuf = -1; +module_param_named(sar_txbuf, mp_sar_txbuf, int, 0); +MODULE_PARM_DESC(sar_txbuf, "SAR TxBuf size"); + +int mp_sar_txmax = -1; +module_param_named(sar_txmax, mp_sar_txmax, int, 0); +MODULE_PARM_DESC(sar_txmax, "SAR TxMax size"); + +char *mp_modulation = NULL; +module_param_named(modulation, mp_modulation, charp, 0); +MODULE_PARM_DESC(modulation, "Modulation"); + +int mp_fine_gain_control = -1; +module_param_named(fine_gain_control, mp_fine_gain_control, int, 0); +MODULE_PARM_DESC(fine_gain_control, "Fine gain control"); + +int mp_fine_gain_value = -1; +module_param_named(fine_gain_value, mp_fine_gain_value, int, 0); +MODULE_PARM_DESC(fine_gain_value, "Fine gain value"); + +int mp_enable_margin_retrain = -1; +module_param_named(enable_margin_retrain, mp_enable_margin_retrain, int, 0); +MODULE_PARM_DESC(enable_margin_retrain, "Enable margin retrain"); + +int mp_margin_threshold = -1; +module_param_named(margin_threshold, mp_margin_threshold, int, 0); +MODULE_PARM_DESC(margin_threshold, "Margin retrain treshold"); + +int mp_enable_rate_adapt = -1; +module_param_named(enable_rate_adapt, mp_enable_rate_adapt, int, 0); +MODULE_PARM_DESC(enable_rate_adapt, "Enable rate adaption"); + +int mp_powercutback = -1; +module_param_named(powercutback, mp_powercutback, int, 0); +MODULE_PARM_DESC(powercutback, "Enable / disable powercutback"); + +int mp_trellis = -1; +module_param_named(trellis, mp_trellis, int, 0); +MODULE_PARM_DESC(trellis, "Enable / disable trellis coding"); + +int mp_bitswap = -1; +module_param_named(bitswap, mp_bitswap, int, 0); +MODULE_PARM_DESC(bitswap, "Enable / disable bitswap"); + +int mp_maximum_bits_per_carrier = -1; +module_param_named(maximum_bits_per_carrier, mp_maximum_bits_per_carrier, int, 0); +MODULE_PARM_DESC(maximum_bits_per_carrier, "Maximum bits per carrier"); + +int mp_maximum_interleave_depth = -1; +module_param_named(maximum_interleave_depth, mp_maximum_interleave_depth, int, 0); +MODULE_PARM_DESC(maximum_interleave_depth, "Maximum interleave depth"); + +int mp_pair_selection = -1; +module_param_named(pair_selection, mp_pair_selection, int, 0); +MODULE_PARM_DESC(pair_selection, "Pair selection"); + +int mp_dgas_polarity = -1; +module_param_named(dgas_polarity, mp_dgas_polarity, int, 0); +MODULE_PARM_DESC(dgas_polarity, "DGAS polarity"); + +int mp_los_alarm = -1; +module_param_named(los_alarm, mp_los_alarm, int, 0); +MODULE_PARM_DESC(los_alarm, "LOS alarm"); + +char *mp_eoc_vendor_id = NULL; +module_param_named(eoc_vendor_id, mp_eoc_vendor_id, charp, 0); +MODULE_PARM_DESC(eoc_vendor_id, "EOC vendor id"); + +int mp_eoc_vendor_revision = -1; +module_param_named(eoc_vendor_revision, mp_eoc_vendor_revision, int, 0); +MODULE_PARM_DESC(eoc_vendor_revision, "EOC vendor revision"); + +char *mp_eoc_vendor_serialnum = NULL; +module_param_named(eoc_vendor_serialnum, mp_eoc_vendor_serialnum, charp, 0); +MODULE_PARM_DESC(eoc_vendor_serialnum, "EOC vendor serial number"); + +char *mp_invntry_vernum = NULL; +module_param_named(invntry_vernum, mp_invntry_vernum, charp, 0); +MODULE_PARM_DESC(invntry_vernum, "Inventory revision number"); + +int mp_dsl_bit_tmode = -1; +module_param_named(dsl_bit_tmode, mp_dsl_bit_tmode, int, 0); +MODULE_PARM_DESC(dsl_bit_tmode, "DSL bit training mode"); + +int mp_high_precision = -1; +module_param_named(high_precision, mp_high_precision, int, 0); +MODULE_PARM_DESC(high_precision, "High precision"); + +int mp_autopvc_enable = -1; +module_param_named(autopvc_enable, mp_autopvc_enable, int, 0); +MODULE_PARM_DESC(autopvc_enable, "Enable / disable automatic PVC"); + +int mp_oam_lb_timeout = -1; +module_param_named(oam_lb_timeout, mp_oam_lb_timeout, int, 0); +MODULE_PARM_DESC(oam_lb_timeout, "OAM LB timeout"); #endif #ifndef TRUE @@ -100,9 +249,9 @@ MODULE_AUTHOR ("Zhicheng Tang"); /*end of externs */ -#ifndef TI_STATIC_ALLOCATIONS -#define TI_STATIC_ALLOCATIONS -#endif +//#ifndef TI_STATIC_ALLOCATIONS +//#define TI_STATIC_ALLOCATIONS +//#endif #define tn7atm_kfree_skb(x) dev_kfree_skb(x) @@ -114,7 +263,7 @@ static int EnableQoS = FALSE; /* prototypes */ static int tn7atm_set_can_support_adsl2 (int can); -static int tn7atm_open (struct atm_vcc *vcc, short vpi, int vci); +static int tn7atm_open (struct atm_vcc *vcc); static void tn7atm_close (struct atm_vcc *vcc); @@ -257,13 +406,12 @@ static const struct atmdev_ops tn7atm_op getsockopt: NULL, setsockopt: NULL, send: tn7atm_send, - sg_send: NULL, phy_put: NULL, phy_get: NULL, change_qos: tn7atm_change_qos, }; -const char drv_proc_root_folder[] = "avalanche/"; +const char drv_proc_root_folder[] = "avalanche"; static struct proc_dir_entry *root_proc_dir_entry = NULL; #define DRV_PROC_MODE 0644 static int proc_root_already_exists = TRUE; @@ -559,62 +707,12 @@ static int turbodsl_check_priority_type( /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * - * Function: int tn7atm_walk_vccs(struct atm_dev *dev, short *vcc, int *vci) - * - * Description: retrieve VPI/VCI for connection - * - *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ -static int tn7atm_walk_vccs (struct atm_vcc *vcc, short *vpi, int *vci) -{ - struct atm_vcc *walk; - - /* - * find a free VPI - */ - if (*vpi == ATM_VPI_ANY) - { - - for (*vpi = 0, walk = vcc->dev->vccs; walk; walk = walk->next) - { - - if ((walk->vci == *vci) && (walk->vpi == *vpi)) - { - (*vpi)++; - walk = vcc->dev->vccs; - } - } - } - - /* - * find a free VCI - */ - if (*vci == ATM_VCI_ANY) - { - - for (*vci = ATM_NOT_RSV_VCI, walk = vcc->dev->vccs; walk; - walk = walk->next) - { - - if ((walk->vpi = *vpi) && (walk->vci == *vci)) - { - *vci = walk->vci + 1; - walk = vcc->dev->vccs; - } - } - } - - return 0; -} - - -/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * * Function: int tn7atm_sar_irq(void) * * Description: tnetd73xx SAR interrupt. * *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ -static void tn7atm_sar_irq (int irq, void *voiddev, struct pt_regs *regs) +static irqreturn_t tn7atm_sar_irq (int irq, void *voiddev) { struct atm_dev *atmdev; Tn7AtmPrivate *priv; @@ -641,6 +739,7 @@ static void tn7atm_sar_irq (int irq, voi #ifdef TIATM_INST_SUPP psp_trace_par (ATM_DRV_SAR_ISR_EXIT, retval); #endif + return IRQ_HANDLED; } /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -650,7 +749,7 @@ static void tn7atm_sar_irq (int irq, voi * Description: tnetd73xx DSL interrupt. * *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ -static void tn7atm_dsl_irq (int irq, void *voiddev, struct pt_regs *regs) +static irqreturn_t tn7atm_dsl_irq (int irq, void *voiddev) { struct atm_dev *atmdev; Tn7AtmPrivate *priv; @@ -672,6 +771,8 @@ static void tn7atm_dsl_irq (int irq, voi #ifdef TIATM_INST_SUPP psp_trace_par (ATM_DRV_DSL_ISR_EXIT, retval); #endif + + return IRQ_HANDLED; } /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -693,25 +794,25 @@ static int __init tn7atm_irq_request (st * Register SAR interrupt */ priv->sar_irq = LNXINTNUM (ATM_SAR_INT); /* Interrupt line # */ - if (request_irq (priv->sar_irq, tn7atm_sar_irq, SA_INTERRUPT, "SAR ", dev)) + if (request_irq (priv->sar_irq, tn7atm_sar_irq, IRQF_DISABLED, "SAR ", dev)) printk ("Could not register tn7atm_sar_irq\n"); /* * interrupt pacing */ ptr = prom_getenv ("sar_ipacemax"); - if (ptr) + if (ptr || mp_sar_ipacemax != -1) { - def_sar_inter_pace = os_atoi (ptr); + def_sar_inter_pace = mp_sar_ipacemax == -1 ? os_atoi (ptr) : mp_sar_ipacemax; } - avalanche_request_pacing (priv->sar_irq, ATM_SAR_INT_PACING_BLOCK_NUM, - def_sar_inter_pace); +/* avalanche_request_pacing (priv->sar_irq, ATM_SAR_INT_PACING_BLOCK_NUM, + def_sar_inter_pace);*/ /* * Reigster Receive interrupt A */ priv->dsl_irq = LNXINTNUM (ATM_DSL_INT); /* Interrupt line # */ - if (request_irq (priv->dsl_irq, tn7atm_dsl_irq, SA_INTERRUPT, "DSL ", dev)) + if (request_irq (priv->dsl_irq, tn7atm_dsl_irq, IRQF_DISABLED, "DSL ", dev)) printk ("Could not register tn7atm_dsl_irq\n"); /***** VRB Tasklet Mode ****/ @@ -842,7 +943,7 @@ static int __init tn7atm_get_ESI (struct char esi_addr[ESI_LEN] = { 0x00, 0x00, 0x11, 0x22, 0x33, 0x44 }; char *esiaddr_str = NULL; - esiaddr_str = prom_getenv ("maca"); + esiaddr_str = mp_macc ? mp_macc : prom_getenv ("maca"); if (!esiaddr_str) { @@ -875,11 +976,15 @@ static int __init tn7atm_get_ESI (struct #define ATM_VBR_RT 5 #endif -int tn7atm_open (struct atm_vcc *vcc, short vpi, int vci) +int tn7atm_open (struct atm_vcc *vcc) { tn7atm_activate_vc_parm_t tn7atm_activate_vc_parm; int rc; //int flags; + tn7atm_activate_vc_parm.pcr = 0x20000; + tn7atm_activate_vc_parm.scr = 0x20000; + tn7atm_activate_vc_parm.mbs = 0x20000; + tn7atm_activate_vc_parm.cdvt = 10000; dgprintf(1, "tn7atm_open()\n"); @@ -891,24 +996,18 @@ int tn7atm_open (struct atm_vcc *vcc, sh return -1; } - MOD_INC_USE_COUNT; - - /* find a free VPI/VCI */ - tn7atm_walk_vccs(vcc, &vpi, &vci); - - vcc->vpi = vpi; - vcc->vci = vci; +// MOD_INC_USE_COUNT; - if ((vci == ATM_VCI_UNSPEC) || (vpi == ATM_VCI_UNSPEC)) + if ((vcc->vci == ATM_VCI_UNSPEC) || (vcc->vpi == ATM_VCI_UNSPEC)) { - MOD_DEC_USE_COUNT; +// MOD_DEC_USE_COUNT; return -EBUSY; } - tn7atm_activate_vc_parm.vpi = vpi; - tn7atm_activate_vc_parm.vci = vci; + tn7atm_activate_vc_parm.vpi = vcc->vpi; + tn7atm_activate_vc_parm.vci = vcc->vci; - if ((vpi == CLEAR_EOC_VPI) && (vci == CLEAR_EOC_VCI)) + if ((vcc->vpi == CLEAR_EOC_VPI) && (vcc->vci == CLEAR_EOC_VCI)) { /* always use (max_dma_chan+1) for clear eoc */ tn7atm_activate_vc_parm.chan = EOC_DMA_CHAN; @@ -916,7 +1015,7 @@ int tn7atm_open (struct atm_vcc *vcc, sh /* check to see whether clear eoc is opened or not */ if (tn7atm_activate_vc_parm.priv->lut[tn7atm_activate_vc_parm.chan].inuse) { - MOD_DEC_USE_COUNT; +// MOD_DEC_USE_COUNT; printk("tn7atm_open: Clear EOC channel (dmachan=%d) already in use.\n", tn7atm_activate_vc_parm.chan); return -EBUSY; } @@ -925,7 +1024,7 @@ int tn7atm_open (struct atm_vcc *vcc, sh if (rc) { printk("tn7atm_open: failed to setup clear_eoc\n"); - MOD_DEC_USE_COUNT; +// MOD_DEC_USE_COUNT; return -EBUSY; } tn7atm_set_lut(tn7atm_activate_vc_parm.priv,vcc, tn7atm_activate_vc_parm.chan); @@ -934,17 +1033,17 @@ int tn7atm_open (struct atm_vcc *vcc, sh } else /* PVC channel setup */ { - if ((vpi==REMOTE_MGMT_VPI) && (vci==REMOTE_MGMT_VCI)) + if ((vcc->vpi==REMOTE_MGMT_VPI) && (vcc->vci==REMOTE_MGMT_VCI)) { tn7atm_activate_vc_parm.chan = 14; /* always use chan 14 for MII PVC-base romote mgmt */ } else { - rc = tn7atm_lut_find(vpi, vci); + rc = tn7atm_lut_find(vcc->vpi, vcc->vci); /* check to see whether PVC is opened or not */ if(ATM_NO_DMA_CHAN != rc) { - MOD_DEC_USE_COUNT; +// MOD_DEC_USE_COUNT; printk("PVC already opened. dmachan = %d\n", rc); return -EBUSY; } @@ -976,6 +1075,7 @@ int tn7atm_open (struct atm_vcc *vcc, sh tn7atm_activate_vc_parm.priority = 2; break; +#if 0 case ATM_VBR: /* Variable Bit Rate-Non RealTime*/ tn7atm_activate_vc_parm.qos = 1; tn7atm_activate_vc_parm.priority = 1; @@ -997,6 +1097,7 @@ int tn7atm_open (struct atm_vcc *vcc, sh tn7atm_activate_vc_parm.mbs = vcc->qos.txtp.max_pcr; tn7atm_activate_vc_parm.cdvt = vcc->qos.txtp.max_cdv; break; +#endif default: tn7atm_activate_vc_parm.qos = 2; @@ -1024,7 +1125,7 @@ int tn7atm_open (struct atm_vcc *vcc, sh if (rc < 0) { printk("failed to activate hw channel\n"); - MOD_DEC_USE_COUNT; +// MOD_DEC_USE_COUNT; tn7atm_lut_clear(vcc, tn7atm_activate_vc_parm.chan); //spin_unlock_irqrestore(&chan_init_lock, flags); return -EBUSY; @@ -1114,7 +1215,7 @@ void tn7atm_close (struct atm_vcc *vcc) tn7atm_lut_clear (vcc, dmachan); //spin_unlock_irqrestore (&closeLock, closeFlag); - MOD_DEC_USE_COUNT; +// MOD_DEC_USE_COUNT; dgprintf (1, "Leave tn7atm_close\n"); } @@ -1528,8 +1629,7 @@ int tn7atm_receive (void *os_dev, int ch * firewall is on */ dgprintf (3, "pushing the skb...\n"); - - skb->stamp = vcc->timestamp = xtime; + __net_timestamp(skb); xdump ((unsigned char *) skb->data, skb->len, 5); @@ -1725,8 +1825,7 @@ static void tn7atm_exit (void) kfree (dev->dev_data); - // atm_dev_deregister (dev); - shutdown_atm_dev (dev); + atm_dev_deregister (dev); /* * remove proc entries @@ -1885,9 +1984,6 @@ static int __init tn7atm_detect (void) /* * Set up proc entry for atm stats */ - if (tn7atm_xlate_proc_name - (drv_proc_root_folder, &root_proc_dir_entry, &residual)) - { printk ("Creating new root folder %s in the proc for the driver stats \n", drv_proc_root_folder); root_proc_dir_entry = proc_mkdir (drv_proc_root_folder, NULL); @@ -1897,7 +1993,6 @@ static int __init tn7atm_detect (void) return -ENOMEM; } proc_root_already_exists = FALSE; - } /* * AV: Clean-up. Moved all the definitions to the data structure. @@ -1981,15 +2076,15 @@ static int tn7atm_autoDetectDspBoost (vo //UR8_MERGE_END CQ10450* cp = prom_getenv ("dsp_noboost"); - if (cp) + if (cp || mp_dsp_noboost != -1) { - dsp_noboost = os_atoi (cp); + dsp_noboost = mp_dsp_noboost == -1 ? os_atoi (cp) : mp_dsp_noboost; } cp = (char *) prom_getenv ("dsp_freq"); - if (cp) + if (cp || mp_dsp_freq != -1) { - dspfreq = os_atoi (cp); + dspfreq = mp_dsp_freq == -1 ? os_atoi (cp) : mp_dsp_freq; if (dspfreq == 250) { boostDsp = 1; @@ -2238,8 +2333,9 @@ static int __init tn7atm_init (struct at // Inter-Op DSL phy Control // Note the setting of _dsl_Feature_0 and _dsl_Feature_1 must before // dslhal_api_dslStartup (in tn7dsl_init()). - if ((ptr = prom_getenv ("DSL_FEATURE_CNTL_0")) != NULL) + if ((ptr = prom_getenv ("DSL_FEATURE_CNTL_0")) != NULL || mp_featctl0 != NULL) { + if (mp_featctl0 != NULL) ptr = mp_featctl0; if ((ptr[0] == '0') && (ptr[1] == 'x')) // skip 0x before pass to // os_atoh ptr += 2; @@ -2247,8 +2343,9 @@ static int __init tn7atm_init (struct at _dsl_Feature_0_defined = 1; } - if ((ptr = prom_getenv ("DSL_FEATURE_CNTL_1")) != NULL) + if ((ptr = prom_getenv ("DSL_FEATURE_CNTL_1")) != NULL || mp_featctl1 != NULL) { + if (mp_featctl1 != NULL) ptr = mp_featctl1; if ((ptr[0] == '0') && (ptr[1] == 'x')) // skip 0x before pass to // os_atoh ptr += 2; @@ -2260,8 +2357,9 @@ static int __init tn7atm_init (struct at // DSL phy Feature Control // Note the setting of _dsl_PhyControl_0 and _dsl_PhyControl_1 must before // dslhal_api_dslStartup (in tn7dsl_init()). - if ((ptr = prom_getenv ("DSL_PHY_CNTL_0")) != NULL) + if ((ptr = prom_getenv ("DSL_PHY_CNTL_0")) != NULL || mp_phyctl0 != NULL) { + if (mp_phyctl0 != NULL) ptr = mp_phyctl0; if ((ptr[0] == '0') && (ptr[1] == 'x')) // skip 0x before pass to // os_atoh ptr += 2; @@ -2269,8 +2367,9 @@ static int __init tn7atm_init (struct at _dsl_PhyControl_0_defined = 1; } - if ((ptr = prom_getenv ("DSL_PHY_CNTL_1")) != NULL) + if ((ptr = prom_getenv ("DSL_PHY_CNTL_1")) != NULL || mp_phyctl1 != NULL) { + if (mp_phyctl1 != NULL) ptr = mp_phyctl1; if ((ptr[0] == '0') && (ptr[1] == 'x')) // skip 0x before pass to // os_atoh ptr += 2; @@ -2298,9 +2397,9 @@ static int __init tn7atm_init (struct at priv->bTurboDsl = 1; // read config for turbo dsl ptr = prom_getenv ("TurboDSL"); - if (ptr) + if (ptr || mp_turbodsl != -1) { - priv->bTurboDsl = os_atoi (ptr); + priv->bTurboDsl = mp_turbodsl == -1 ? os_atoi (ptr) : mp_turbodsl; } // @Added to make Rx buffer number & Service max configurable through @@ -2308,30 +2407,30 @@ static int __init tn7atm_init (struct at priv->sarRxBuf = RX_BUFFER_NUM; ptr = NULL; ptr = prom_getenv ("SarRxBuf"); - if (ptr) + if (ptr || mp_sar_rxbuf != -1) { - priv->sarRxBuf = os_atoi (ptr); + priv->sarRxBuf = mp_sar_rxbuf == -1 ? os_atoi (ptr) : mp_sar_rxbuf; } priv->sarRxMax = RX_SERVICE_MAX; ptr = NULL; ptr = prom_getenv ("SarRxMax"); - if (ptr) + if (ptr || mp_sar_rxmax != -1) { - priv->sarRxMax = os_atoi (ptr); + priv->sarRxMax = mp_sar_rxmax == -1 ? os_atoi (ptr) : mp_sar_rxmax; } priv->sarTxBuf = TX_BUFFER_NUM; ptr = NULL; ptr = prom_getenv ("SarTxBuf"); - if (ptr) + if (ptr || mp_sar_txbuf != -1) { - priv->sarTxBuf = os_atoi (ptr); + priv->sarTxBuf = mp_sar_txbuf == -1 ? os_atoi (ptr) : mp_sar_txbuf; } priv->sarTxMax = TX_SERVICE_MAX; ptr = NULL; ptr = prom_getenv ("SarTxMax"); - if (ptr) + if (ptr || mp_sar_txmax != -1) { - priv->sarTxMax = os_atoi (ptr); + priv->sarTxMax = mp_sar_txmax == -1 ? os_atoi (ptr) : mp_sar_txmax; } return 0; @@ -2479,7 +2578,5 @@ static int tn7atm_proc_qos_write(struct return count; } -#ifdef MODULE module_init (tn7atm_detect); module_exit (tn7atm_exit); -#endif /* MODULE */