diff options
Diffstat (limited to 'drivers/atm')
39 files changed, 6132 insertions, 10239 deletions
diff --git a/drivers/atm/Kconfig b/drivers/atm/Kconfig index b554edac1ce..31c60101a69 100644 --- a/drivers/atm/Kconfig +++ b/drivers/atm/Kconfig @@ -177,7 +177,7 @@ config ATM_ZATM_DEBUG config ATM_NICSTAR tristate "IDT 77201 (NICStAR) (ForeRunnerLE)" - depends on PCI && !64BIT && VIRT_TO_BUS + depends on PCI help The NICStAR chipset family is used in a large number of ATM NICs for 25 and for 155 Mbps, including IDT cards and the Fore ForeRunnerLE @@ -294,14 +294,14 @@ config ATM_HORIZON_DEBUG config ATM_IA tristate "Interphase ATM PCI x575/x525/x531" - depends on PCI && !64BIT + depends on PCI ---help--- This is a driver for the Interphase (i)ChipSAR adapter cards which include a variety of variants in term of the size of the control memory (128K-1KVC, 512K-4KVC), the size of the packet memory (128K, 512K, 1M), and the PHY type (Single/Multi mode OC3, UTP155, UTP25, DS3 and E3). Go to: - <http://www.iphase.com/products/ClassSheet.cfm?ClassID=ATM> + <http://www.iphase.com/> for more info about the cards. Say Y (or M to compile as a module named iphase) here if you have one of these cards. @@ -325,81 +325,22 @@ config ATM_IA_DEBUG speed of the driver, and the size of your syslog files! When inactive, they will have only a modest impact on performance. -config ATM_FORE200E_MAYBE +config ATM_FORE200E tristate "FORE Systems 200E-series" - depends on PCI || SBUS + depends on (PCI || SBUS) + select FW_LOADER ---help--- This is a driver for the FORE Systems 200E-series ATM adapter cards. It simultaneously supports PCA-200E and SBA-200E models on PCI and SBUS hosts. Say Y (or M to compile as a module named fore_200e) here if you have one of these ATM adapters. - Note that the driver will actually be compiled only if you - additionally enable the support for PCA-200E and/or SBA-200E - cards. - See the file <file:Documentation/networking/fore200e.txt> for further details. -config ATM_FORE200E_PCA - bool "PCA-200E support" - depends on ATM_FORE200E_MAYBE && PCI - help - Say Y here if you want your PCA-200E cards to be probed. - -config ATM_FORE200E_PCA_DEFAULT_FW - bool "Use default PCA-200E firmware (normally enabled)" - depends on ATM_FORE200E_PCA - help - Use the default PCA-200E firmware data shipped with the driver. - - Normal users do not have to deal with the firmware stuff, so - they should say Y here. - -config ATM_FORE200E_PCA_FW - string "Pathname of user-supplied binary firmware" - depends on ATM_FORE200E_PCA && !ATM_FORE200E_PCA_DEFAULT_FW - default "" - help - This defines the pathname of an alternative PCA-200E binary - firmware image supplied by the user. This pathname may be - absolute or relative to the drivers/atm directory. - - The driver comes with an adequate firmware image, so normal users do - not have to supply an alternative one. They just say Y to "Use - default PCA-200E firmware" instead. - -config ATM_FORE200E_SBA - bool "SBA-200E support" - depends on ATM_FORE200E_MAYBE && SBUS - help - Say Y here if you want your SBA-200E cards to be probed. - -config ATM_FORE200E_SBA_DEFAULT_FW - bool "Use default SBA-200E firmware (normally enabled)" - depends on ATM_FORE200E_SBA - help - Use the default SBA-200E firmware data shipped with the driver. - - Normal users do not have to deal with the firmware stuff, so - they should say Y here. - -config ATM_FORE200E_SBA_FW - string "Pathname of user-supplied binary firmware" - depends on ATM_FORE200E_SBA && !ATM_FORE200E_SBA_DEFAULT_FW - default "" - help - This defines the pathname of an alternative SBA-200E binary - firmware image supplied by the user. This pathname may be - absolute or relative to the drivers/atm directory. - - The driver comes with an adequate firmware image, so normal users do - not have to supply an alternative one. They just say Y to "Use - default SBA-200E firmware", above. - config ATM_FORE200E_USE_TASKLET bool "Defer interrupt work to a tasklet" - depends on (PCI || SBUS) && (ATM_FORE200E_PCA || ATM_FORE200E_SBA) + depends on ATM_FORE200E default n help This defers work to be done by the interrupt handler to a @@ -408,7 +349,7 @@ config ATM_FORE200E_USE_TASKLET config ATM_FORE200E_TX_RETRY int "Maximum number of tx retries" - depends on (PCI || SBUS) && (ATM_FORE200E_PCA || ATM_FORE200E_SBA) + depends on ATM_FORE200E default "16" ---help--- Specifies the number of times the driver attempts to transmit @@ -425,7 +366,7 @@ config ATM_FORE200E_TX_RETRY config ATM_FORE200E_DEBUG int "Debugging level (0-3)" - depends on (PCI || SBUS) && (ATM_FORE200E_PCA || ATM_FORE200E_SBA) + depends on ATM_FORE200E default "0" help Specifies the level of debugging messages issued by the driver. @@ -436,12 +377,6 @@ config ATM_FORE200E_DEBUG the performances of the driver, and the size of your syslog files! Keep the debugging level to 0 during normal operations. -config ATM_FORE200E - tristate - depends on (PCI || SBUS) && (ATM_FORE200E_PCA || ATM_FORE200E_SBA) - default m if ATM_FORE200E_MAYBE!=y - default y if ATM_FORE200E_MAYBE=y - config ATM_HE tristate "ForeRunner HE Series" depends on PCI @@ -456,4 +391,11 @@ config ATM_HE_USE_SUNI Support for the S/UNI-Ultra and S/UNI-622 found in the ForeRunner HE cards. This driver provides carrier detection some statistics. +config ATM_SOLOS + tristate "Solos ADSL2+ PCI Multiport card driver" + depends on PCI + select FW_LOADER + help + Support for the Solos multiport ADSL2+ card. + endif # ATM diff --git a/drivers/atm/Makefile b/drivers/atm/Makefile index e4fa9965869..c6c9ee9f5da 100644 --- a/drivers/atm/Makefile +++ b/drivers/atm/Makefile @@ -2,15 +2,7 @@ # Makefile for the Linux network (ATM) device drivers. # -fore_200e-objs := fore200e.o -hostprogs-y := fore200e_mkfirm - -# Files generated that shall be removed upon make clean -clean-files := atmsar11.bin atmsar11.bin1 atmsar11.bin2 pca200e.bin \ - pca200e.bin1 pca200e.bin2 pca200e_ecd.bin pca200e_ecd.bin1 \ - pca200e_ecd.bin2 sba200e_ecd.bin sba200e_ecd.bin1 sba200e_ecd.bin2 -# Firmware generated that shall be removed upon make clean -clean-files += fore200e_pca_fw.c fore200e_sba_fw.c +fore_200e-y := fore200e.o obj-$(CONFIG_ATM_ZATM) += zatm.o uPD98402.o obj-$(CONFIG_ATM_NICSTAR) += nicstar.o @@ -20,6 +12,7 @@ obj-$(CONFIG_ATM_IA) += iphase.o suni.o obj-$(CONFIG_ATM_FORE200E) += fore_200e.o obj-$(CONFIG_ATM_ENI) += eni.o suni.o obj-$(CONFIG_ATM_IDT77252) += idt77252.o +obj-$(CONFIG_ATM_SOLOS) += solos-pci.o ifeq ($(CONFIG_ATM_NICSTAR_USE_SUNI),y) obj-$(CONFIG_ATM_NICSTAR) += suni.o @@ -36,38 +29,7 @@ obj-$(CONFIG_ATM_TCP) += atmtcp.o obj-$(CONFIG_ATM_FIRESTREAM) += firestream.o obj-$(CONFIG_ATM_LANAI) += lanai.o -ifeq ($(CONFIG_ATM_FORE200E_PCA),y) - fore_200e-objs += fore200e_pca_fw.o - # guess the target endianess to choose the right PCA-200E firmware image - ifeq ($(CONFIG_ATM_FORE200E_PCA_DEFAULT_FW),y) - byteorder.h := include$(if $(patsubst $(srctree),,$(objtree)),2)/asm/byteorder.h - CONFIG_ATM_FORE200E_PCA_FW := $(obj)/pca200e$(if $(shell $(CC) $(KBUILD_CPPFLAGS) -E -dM $(byteorder.h) | grep ' __LITTLE_ENDIAN '),.bin,_ecd.bin2) - endif -endif - -ifeq ($(CONFIG_ATM_FORE200E_SBA),y) - fore_200e-objs += fore200e_sba_fw.o - ifeq ($(CONFIG_ATM_FORE200E_SBA_DEFAULT_FW),y) - CONFIG_ATM_FORE200E_SBA_FW := $(obj)/sba200e_ecd.bin2 - endif -endif obj-$(CONFIG_ATM_HE) += he.o ifeq ($(CONFIG_ATM_HE_USE_SUNI),y) obj-$(CONFIG_ATM_HE) += suni.o endif - -# FORE Systems 200E-series firmware magic -$(obj)/fore200e_pca_fw.c: $(patsubst "%", %, $(CONFIG_ATM_FORE200E_PCA_FW)) \ - $(obj)/fore200e_mkfirm - $(obj)/fore200e_mkfirm -k -b _fore200e_pca_fw \ - -i $(CONFIG_ATM_FORE200E_PCA_FW) -o $@ - -$(obj)/fore200e_sba_fw.c: $(patsubst "%", %, $(CONFIG_ATM_FORE200E_SBA_FW)) \ - $(obj)/fore200e_mkfirm - $(obj)/fore200e_mkfirm -k -b _fore200e_sba_fw \ - -i $(CONFIG_ATM_FORE200E_SBA_FW) -o $@ - -# deal with the various suffixes of the binary firmware images -$(obj)/%.bin $(obj)/%.bin1 $(obj)/%.bin2: $(src)/%.data - objcopy -Iihex $< -Obinary $@.gz - gzip -n -df $@.gz diff --git a/drivers/atm/adummy.c b/drivers/atm/adummy.c index 2ebd07f2ef8..f9b983ae687 100644 --- a/drivers/atm/adummy.c +++ b/drivers/atm/adummy.c @@ -3,7 +3,6 @@ */ #include <linux/module.h> -#include <linux/version.h> #include <linux/kernel.h> #include <linux/skbuff.h> #include <linux/errno.h> @@ -14,6 +13,7 @@ #include <linux/mm.h> #include <linux/timer.h> #include <linux/interrupt.h> +#include <linux/slab.h> #include <asm/io.h> #include <asm/byteorder.h> #include <asm/uaccess.h> @@ -40,6 +40,42 @@ struct adummy_dev { static LIST_HEAD(adummy_devs); +static ssize_t __set_signal(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct atm_dev *atm_dev = container_of(dev, struct atm_dev, class_dev); + int signal; + + if (sscanf(buf, "%d", &signal) == 1) { + + if (signal < ATM_PHY_SIG_LOST || signal > ATM_PHY_SIG_FOUND) + signal = ATM_PHY_SIG_UNKNOWN; + + atm_dev_signal_change(atm_dev, signal); + return 1; + } + return -EINVAL; +} + +static ssize_t __show_signal(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct atm_dev *atm_dev = container_of(dev, struct atm_dev, class_dev); + return sprintf(buf, "%d\n", atm_dev->signal); +} +static DEVICE_ATTR(signal, 0644, __show_signal, __set_signal); + +static struct attribute *adummy_attrs[] = { + &dev_attr_signal.attr, + NULL +}; + +static struct attribute_group adummy_group_attrs = { + .name = NULL, /* We want them in dev's root folder */ + .attrs = adummy_attrs +}; + static int __init adummy_start(struct atm_dev *dev) { @@ -118,7 +154,7 @@ static int __init adummy_init(void) err = -ENOMEM; goto out; } - atm_dev = atm_dev_register(DEV_LABEL, &adummy_ops, -1, NULL); + atm_dev = atm_dev_register(DEV_LABEL, NULL, &adummy_ops, -1, NULL); if (!atm_dev) { printk(KERN_ERR DEV_LABEL ": atm_dev_register() failed\n"); err = -ENODEV; @@ -128,6 +164,9 @@ static int __init adummy_init(void) adummy_dev->atm_dev = atm_dev; atm_dev->dev_data = adummy_dev; + if (sysfs_create_group(&atm_dev->class_dev.kobj, &adummy_group_attrs)) + dev_err(&atm_dev->class_dev, "Could not register attrs for adummy\n"); + if (adummy_start(atm_dev)) { printk(KERN_ERR DEV_LABEL ": adummy_start() failed\n"); err = -ENODEV; diff --git a/drivers/atm/ambassador.c b/drivers/atm/ambassador.c index 7b44a596515..f1a9198dfe5 100644 --- a/drivers/atm/ambassador.c +++ b/drivers/atm/ambassador.c @@ -33,8 +33,12 @@ #include <linux/interrupt.h> #include <linux/poison.h> #include <linux/bitrev.h> +#include <linux/mutex.h> +#include <linux/firmware.h> +#include <linux/ihex.h> +#include <linux/slab.h> -#include <asm/atomic.h> +#include <linux/atomic.h> #include <asm/io.h> #include <asm/byteorder.h> @@ -289,29 +293,6 @@ static inline void __init show_version (void) { */ -/********** microcode **********/ - -#ifdef AMB_NEW_MICROCODE -#define UCODE(x) UCODE2(atmsar12.x) -#else -#define UCODE(x) UCODE2(atmsar11.x) -#endif -#define UCODE2(x) #x - -static u32 __devinitdata ucode_start = -#include UCODE(start) -; - -static region __devinitdata ucode_regions[] = { -#include UCODE(regions) - { 0, 0 } -}; - -static u32 __devinitdata ucode_data[] = { -#include UCODE(data) - 0xdeadbeef -}; - static void do_housekeeping (unsigned long arg); /********** globals **********/ @@ -437,7 +418,7 @@ static inline void dump_skb (char * prefix, unsigned int vc, struct sk_buff * sk /* see limitations under Hardware Features */ -static inline int check_area (void * start, size_t length) { +static int check_area (void * start, size_t length) { // assumes length > 0 const u32 fourmegmask = -1 << 22; const u32 twofivesixmask = -1 << 8; @@ -456,7 +437,7 @@ static inline int check_area (void * start, size_t length) { /********** free an skb (as per ATM device driver documentation) **********/ -static inline void amb_kfree_skb (struct sk_buff * skb) { +static void amb_kfree_skb (struct sk_buff * skb) { if (ATM_SKB(skb)->vcc->pop) { ATM_SKB(skb)->vcc->pop (ATM_SKB(skb)->vcc, skb); } else { @@ -466,7 +447,7 @@ static inline void amb_kfree_skb (struct sk_buff * skb) { /********** TX completion **********/ -static inline void tx_complete (amb_dev * dev, tx_out * tx) { +static void tx_complete (amb_dev * dev, tx_out * tx) { tx_simple * tx_descr = bus_to_virt (tx->handle); struct sk_buff * skb = tx_descr->skb; @@ -516,7 +497,7 @@ static void rx_complete (amb_dev * dev, rx_out * rx) { // VC layer stats atomic_inc(&atm_vcc->stats->rx); __net_timestamp(skb); - // end of our responsability + // end of our responsibility atm_vcc->push (atm_vcc, skb); return; @@ -643,7 +624,7 @@ static int command_do (amb_dev * dev, command * cmd) { /********** TX queue pair **********/ -static inline int tx_give (amb_dev * dev, tx_in * tx) { +static int tx_give (amb_dev * dev, tx_in * tx) { amb_txq * txq = &dev->txq; unsigned long flags; @@ -675,7 +656,7 @@ static inline int tx_give (amb_dev * dev, tx_in * tx) { } } -static inline int tx_take (amb_dev * dev) { +static int tx_take (amb_dev * dev) { amb_txq * txq = &dev->txq; unsigned long flags; @@ -703,7 +684,7 @@ static inline int tx_take (amb_dev * dev) { /********** RX queue pairs **********/ -static inline int rx_give (amb_dev * dev, rx_in * rx, unsigned char pool) { +static int rx_give (amb_dev * dev, rx_in * rx, unsigned char pool) { amb_rxq * rxq = &dev->rxq[pool]; unsigned long flags; @@ -728,7 +709,7 @@ static inline int rx_give (amb_dev * dev, rx_in * rx, unsigned char pool) { } } -static inline int rx_take (amb_dev * dev, unsigned char pool) { +static int rx_take (amb_dev * dev, unsigned char pool) { amb_rxq * rxq = &dev->rxq[pool]; unsigned long flags; @@ -761,7 +742,7 @@ static inline int rx_take (amb_dev * dev, unsigned char pool) { /********** RX Pool handling **********/ /* pre: buffers_wanted = 0, post: pending = 0 */ -static inline void drain_rx_pool (amb_dev * dev, unsigned char pool) { +static void drain_rx_pool (amb_dev * dev, unsigned char pool) { amb_rxq * rxq = &dev->rxq[pool]; PRINTD (DBG_FLOW|DBG_POOL, "drain_rx_pool %p %hu", dev, pool); @@ -796,7 +777,7 @@ static void drain_rx_pools (amb_dev * dev) { drain_rx_pool (dev, pool); } -static inline void fill_rx_pool (amb_dev * dev, unsigned char pool, +static void fill_rx_pool (amb_dev * dev, unsigned char pool, gfp_t priority) { rx_in rx; @@ -821,7 +802,7 @@ static inline void fill_rx_pool (amb_dev * dev, unsigned char pool, } // cast needed as there is no %? for pointer differences PRINTD (DBG_SKB, "allocated skb at %p, head %p, area %li", - skb, skb->head, (long) (skb_end_pointer(skb) - skb->head)); + skb, skb->head, (long) skb_end_offset(skb)); rx.handle = virt_to_bus (skb); rx.host_address = cpu_to_be32 (virt_to_bus (skb->data)); if (rx_give (dev, &rx, pool)) @@ -832,7 +813,7 @@ static inline void fill_rx_pool (amb_dev * dev, unsigned char pool, return; } -// top up all RX pools (can also be called as a bottom half) +// top up all RX pools static void fill_rx_pools (amb_dev * dev) { unsigned char pool; @@ -846,7 +827,7 @@ static void fill_rx_pools (amb_dev * dev) { /********** enable host interrupts **********/ -static inline void interrupts_on (amb_dev * dev) { +static void interrupts_on (amb_dev * dev) { wr_plain (dev, offsetof(amb_mem, interrupt_control), rd_plain (dev, offsetof(amb_mem, interrupt_control)) | AMB_INTERRUPT_BITS); @@ -854,7 +835,7 @@ static inline void interrupts_on (amb_dev * dev) { /********** disable host interrupts **********/ -static inline void interrupts_off (amb_dev * dev) { +static void interrupts_off (amb_dev * dev) { wr_plain (dev, offsetof(amb_mem, interrupt_control), rd_plain (dev, offsetof(amb_mem, interrupt_control)) &~ AMB_INTERRUPT_BITS); @@ -891,11 +872,7 @@ static irqreturn_t interrupt_handler(int irq, void *dev_id) { ++irq_work; if (irq_work) { -#ifdef FILL_RX_POOLS_IN_BH - schedule_work (&dev->bh); -#else fill_rx_pools (dev); -#endif PRINTD (DBG_IRQ, "work done: %u", irq_work); } else { @@ -1177,7 +1154,7 @@ static int amb_open (struct atm_vcc * atm_vcc) vcc->tx_frame_bits = tx_frame_bits; - down (&dev->vcc_sf); + mutex_lock(&dev->vcc_sf); if (dev->rxer[vci]) { // RXer on the channel already, just modify rate... cmd.request = cpu_to_be32 (SRB_MODIFY_VC_RATE); @@ -1203,7 +1180,7 @@ static int amb_open (struct atm_vcc * atm_vcc) schedule(); } dev->txer[vci].tx_present = 1; - up (&dev->vcc_sf); + mutex_unlock(&dev->vcc_sf); } if (rxtp->traffic_class != ATM_NONE) { @@ -1211,7 +1188,7 @@ static int amb_open (struct atm_vcc * atm_vcc) vcc->rx_info.pool = pool; - down (&dev->vcc_sf); + mutex_lock(&dev->vcc_sf); /* grow RX buffer pool */ if (!dev->rxq[pool].buffers_wanted) dev->rxq[pool].buffers_wanted = rx_lats; @@ -1237,7 +1214,7 @@ static int amb_open (struct atm_vcc * atm_vcc) schedule(); // this link allows RX frames through dev->rxer[vci] = atm_vcc; - up (&dev->vcc_sf); + mutex_unlock(&dev->vcc_sf); } // indicate readiness @@ -1262,7 +1239,7 @@ static void amb_close (struct atm_vcc * atm_vcc) { if (atm_vcc->qos.txtp.traffic_class != ATM_NONE) { command cmd; - down (&dev->vcc_sf); + mutex_lock(&dev->vcc_sf); if (dev->rxer[vci]) { // RXer still on the channel, just modify rate... XXX not really needed cmd.request = cpu_to_be32 (SRB_MODIFY_VC_RATE); @@ -1277,7 +1254,7 @@ static void amb_close (struct atm_vcc * atm_vcc) { dev->txer[vci].tx_present = 0; while (command_do (dev, &cmd)) schedule(); - up (&dev->vcc_sf); + mutex_unlock(&dev->vcc_sf); } // disable RXing @@ -1287,7 +1264,7 @@ static void amb_close (struct atm_vcc * atm_vcc) { // this is (the?) one reason why we need the amb_vcc struct unsigned char pool = vcc->rx_info.pool; - down (&dev->vcc_sf); + mutex_lock(&dev->vcc_sf); if (dev->txer[vci].tx_present) { // TXer still on the channel, just go to pool zero XXX not really needed cmd.request = cpu_to_be32 (SRB_MODIFY_VC_FLAGS); @@ -1314,7 +1291,7 @@ static void amb_close (struct atm_vcc * atm_vcc) { dev->rxq[pool].buffers_wanted = 0; drain_rx_pool (dev, pool); } - up (&dev->vcc_sf); + mutex_unlock(&dev->vcc_sf); } // free our structure @@ -1326,14 +1303,6 @@ static void amb_close (struct atm_vcc * atm_vcc) { return; } -/********** Set socket options for a VC **********/ - -// int amb_getsockopt (struct atm_vcc * atm_vcc, int level, int optname, void * optval, int optlen); - -/********** Set socket options for a VC **********/ - -// int amb_setsockopt (struct atm_vcc * atm_vcc, int level, int optname, void * optval, int optlen); - /********** Send **********/ static int amb_send (struct atm_vcc * atm_vcc, struct sk_buff * skb) { @@ -1434,7 +1403,7 @@ static void amb_free_rx_skb (struct atm_vcc * atm_vcc, struct sk_buff * skb) { rx.host_address = cpu_to_be32 (virt_to_bus (skb->data)); skb->data = skb->head; - skb->tail = skb->head; + skb_reset_tail_pointer(skb); skb->len = 0; if (!rx_give (dev, &rx, pool)) { @@ -1538,9 +1507,9 @@ static void do_housekeeping (unsigned long arg) { /********** creation of communication queues **********/ -static int __devinit create_queues (amb_dev * dev, unsigned int cmds, - unsigned int txs, unsigned int * rxs, - unsigned int * rx_buffer_sizes) { +static int create_queues(amb_dev *dev, unsigned int cmds, unsigned int txs, + unsigned int *rxs, unsigned int *rx_buffer_sizes) +{ unsigned char pool; size_t total = 0; void * memory; @@ -1768,8 +1737,9 @@ static int decode_loader_result (loader_command cmd, u32 result) return res; } -static int __devinit do_loader_command (volatile loader_block * lb, - const amb_dev * dev, loader_command cmd) { +static int do_loader_command(volatile loader_block *lb, const amb_dev *dev, + loader_command cmd) +{ unsigned long timeout; @@ -1824,8 +1794,9 @@ static int __devinit do_loader_command (volatile loader_block * lb, /* loader: determine loader version */ -static int __devinit get_loader_version (loader_block * lb, - const amb_dev * dev, u32 * version) { +static int get_loader_version(loader_block *lb, const amb_dev *dev, + u32 *version) +{ int res; PRINTD (DBG_FLOW|DBG_LOAD, "get_loader_version"); @@ -1840,52 +1811,41 @@ static int __devinit get_loader_version (loader_block * lb, /* loader: write memory data blocks */ -static int __devinit loader_write (loader_block * lb, - const amb_dev * dev, const u32 * data, - u32 address, unsigned int count) { - unsigned int i; +static int loader_write(loader_block *lb, const amb_dev *dev, + const struct ihex_binrec *rec) +{ transfer_block * tb = &lb->payload.transfer; PRINTD (DBG_FLOW|DBG_LOAD, "loader_write"); - - if (count > MAX_TRANSFER_DATA) - return -EINVAL; - tb->address = cpu_to_be32 (address); - tb->count = cpu_to_be32 (count); - for (i = 0; i < count; ++i) - tb->data[i] = cpu_to_be32 (data[i]); + + tb->address = rec->addr; + tb->count = cpu_to_be32(be16_to_cpu(rec->len) / 4); + memcpy(tb->data, rec->data, be16_to_cpu(rec->len)); return do_loader_command (lb, dev, write_adapter_memory); } /* loader: verify memory data blocks */ -static int __devinit loader_verify (loader_block * lb, - const amb_dev * dev, const u32 * data, - u32 address, unsigned int count) { - unsigned int i; +static int loader_verify(loader_block *lb, const amb_dev *dev, + const struct ihex_binrec *rec) +{ transfer_block * tb = &lb->payload.transfer; int res; PRINTD (DBG_FLOW|DBG_LOAD, "loader_verify"); - if (count > MAX_TRANSFER_DATA) - return -EINVAL; - tb->address = cpu_to_be32 (address); - tb->count = cpu_to_be32 (count); + tb->address = rec->addr; + tb->count = cpu_to_be32(be16_to_cpu(rec->len) / 4); res = do_loader_command (lb, dev, read_adapter_memory); - if (!res) - for (i = 0; i < count; ++i) - if (tb->data[i] != cpu_to_be32 (data[i])) { - res = -EINVAL; - break; - } + if (!res && memcmp(tb->data, rec->data, be16_to_cpu(rec->len))) + res = -EINVAL; return res; } /* loader: start microcode */ -static int __devinit loader_start (loader_block * lb, - const amb_dev * dev, u32 address) { +static int loader_start(loader_block *lb, const amb_dev *dev, u32 address) +{ PRINTD (DBG_FLOW|DBG_LOAD, "loader_start"); lb->payload.start = cpu_to_be32 (address); @@ -1960,48 +1920,61 @@ static int amb_reset (amb_dev * dev, int diags) { /********** transfer and start the microcode **********/ -static int __devinit ucode_init (loader_block * lb, amb_dev * dev) { - unsigned int i = 0; - unsigned int total = 0; - const u32 * pointer = ucode_data; - u32 address; - unsigned int count; +static int ucode_init(loader_block *lb, amb_dev *dev) +{ + const struct firmware *fw; + unsigned long start_address; + const struct ihex_binrec *rec; + const char *errmsg = NULL; int res; - + + res = request_ihex_firmware(&fw, "atmsar11.fw", &dev->pci_dev->dev); + if (res) { + PRINTK (KERN_ERR, "Cannot load microcode data"); + return res; + } + + /* First record contains just the start address */ + rec = (const struct ihex_binrec *)fw->data; + if (be16_to_cpu(rec->len) != sizeof(__be32) || be32_to_cpu(rec->addr)) { + errmsg = "no start record"; + goto fail; + } + start_address = be32_to_cpup((__be32 *)rec->data); + + rec = ihex_next_binrec(rec); + PRINTD (DBG_FLOW|DBG_LOAD, "ucode_init"); - - while (address = ucode_regions[i].start, - count = ucode_regions[i].count) { - PRINTD (DBG_LOAD, "starting region (%x, %u)", address, count); - while (count) { - unsigned int words; - if (count <= MAX_TRANSFER_DATA) - words = count; - else - words = MAX_TRANSFER_DATA; - total += words; - res = loader_write (lb, dev, pointer, address, words); - if (res) - return res; - res = loader_verify (lb, dev, pointer, address, words); - if (res) - return res; - count -= words; - address += sizeof(u32) * words; - pointer += words; + + while (rec) { + PRINTD (DBG_LOAD, "starting region (%x, %u)", be32_to_cpu(rec->addr), + be16_to_cpu(rec->len)); + if (be16_to_cpu(rec->len) > 4 * MAX_TRANSFER_DATA) { + errmsg = "record too long"; + goto fail; } - i += 1; - } - if (*pointer == ATM_POISON) { - return loader_start (lb, dev, ucode_start); - } else { - // cast needed as there is no %? for pointer differnces - PRINTD (DBG_LOAD|DBG_ERR, - "offset=%li, *pointer=%x, address=%x, total=%u", - (long) (pointer - ucode_data), *pointer, address, total); - PRINTK (KERN_ERR, "incorrect microcode data"); - return -ENOMEM; + if (be16_to_cpu(rec->len) & 3) { + errmsg = "odd number of bytes"; + goto fail; + } + res = loader_write(lb, dev, rec); + if (res) + break; + + res = loader_verify(lb, dev, rec); + if (res) + break; + rec = ihex_next_binrec(rec); } + release_firmware(fw); + if (!res) + res = loader_start(lb, dev, start_address); + + return res; +fail: + release_firmware(fw); + PRINTK(KERN_ERR, "Bad microcode data (%s)", errmsg); + return -EINVAL; } /********** give adapter parameters **********/ @@ -2010,7 +1983,8 @@ static inline __be32 bus_addr(void * addr) { return cpu_to_be32 (virt_to_bus (addr)); } -static int __devinit amb_talk (amb_dev * dev) { +static int amb_talk(amb_dev *dev) +{ adap_talk_block a; unsigned char pool; unsigned long timeout; @@ -2057,7 +2031,8 @@ static int __devinit amb_talk (amb_dev * dev) { } // get microcode version -static void __devinit amb_ucode_version (amb_dev * dev) { +static void amb_ucode_version(amb_dev *dev) +{ u32 major; u32 minor; command cmd; @@ -2072,7 +2047,8 @@ static void __devinit amb_ucode_version (amb_dev * dev) { } // get end station address -static void __devinit amb_esi (amb_dev * dev, u8 * esi) { +static void amb_esi(amb_dev *dev, u8 *esi) +{ u32 lower4; u16 upper2; command cmd; @@ -2118,7 +2094,7 @@ static void fixup_plx_window (amb_dev *dev, loader_block *lb) return; } -static int __devinit amb_init (amb_dev * dev) +static int amb_init(amb_dev *dev) { loader_block lb; @@ -2181,14 +2157,9 @@ static void setup_dev(amb_dev *dev, struct pci_dev *pci_dev) dev->tx_avail = ATM_OC3_PCR; dev->rx_avail = ATM_OC3_PCR; -#ifdef FILL_RX_POOLS_IN_BH - // initialise bottom half - INIT_WORK(&dev->bh, (void (*)(void *)) fill_rx_pools, dev); -#endif - // semaphore for txer/rxer modifications - we cannot use a // spinlock as the critical region needs to switch processes - init_MUTEX (&dev->vcc_sf); + mutex_init(&dev->vcc_sf); // queue manipulation spinlocks; we want atomic reads and // writes to the queue descriptors (handles IRQ and SMP) // consider replacing "int pending" -> "atomic_t available" @@ -2219,7 +2190,8 @@ static void setup_pci_dev(struct pci_dev *pci_dev) } } -static int __devinit amb_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent) +static int amb_probe(struct pci_dev *pci_dev, + const struct pci_device_id *pci_ent) { amb_dev * dev; int err; @@ -2276,7 +2248,8 @@ static int __devinit amb_probe(struct pci_dev *pci_dev, const struct pci_device_ goto out_reset; } - dev->atm_dev = atm_dev_register (DEV_LABEL, &amb_ops, -1, NULL); + dev->atm_dev = atm_dev_register (DEV_LABEL, &pci_dev->dev, &amb_ops, -1, + NULL); if (!dev->atm_dev) { PRINTD (DBG_ERR, "failed to register Madge ATM adapter"); err = -EINVAL; @@ -2319,7 +2292,7 @@ out_disable: } -static void __devexit amb_remove_one(struct pci_dev *pci_dev) +static void amb_remove_one(struct pci_dev *pci_dev) { struct amb_dev *dev; @@ -2384,6 +2357,7 @@ static void __init amb_check_args (void) { MODULE_AUTHOR(maintainer_string); MODULE_DESCRIPTION(description_string); MODULE_LICENSE("GPL"); +MODULE_FIRMWARE("atmsar11.fw"); module_param(debug, ushort, 0644); module_param(cmds, uint, 0); module_param(txs, uint, 0); @@ -2402,10 +2376,8 @@ MODULE_PARM_DESC(pci_lat, "PCI latency in bus cycles"); /********** module entry **********/ static struct pci_device_id amb_pci_tbl[] = { - { PCI_VENDOR_ID_MADGE, PCI_DEVICE_ID_MADGE_AMBASSADOR, PCI_ANY_ID, PCI_ANY_ID, - 0, 0, 0 }, - { PCI_VENDOR_ID_MADGE, PCI_DEVICE_ID_MADGE_AMBASSADOR_BAD, PCI_ANY_ID, PCI_ANY_ID, - 0, 0, 0 }, + { PCI_VDEVICE(MADGE, PCI_DEVICE_ID_MADGE_AMBASSADOR), 0 }, + { PCI_VDEVICE(MADGE, PCI_DEVICE_ID_MADGE_AMBASSADOR_BAD), 0 }, { 0, } }; @@ -2414,7 +2386,7 @@ MODULE_DEVICE_TABLE(pci, amb_pci_tbl); static struct pci_driver amb_driver = { .name = "amb", .probe = amb_probe, - .remove = __devexit_p(amb_remove_one), + .remove = amb_remove_one, .id_table = amb_pci_tbl, }; diff --git a/drivers/atm/ambassador.h b/drivers/atm/ambassador.h index ff2a303cbe0..aa9710556bd 100644 --- a/drivers/atm/ambassador.h +++ b/drivers/atm/ambassador.h @@ -630,15 +630,11 @@ struct amb_dev { u32 iobase; u32 * membase; -#ifdef FILL_RX_POOLS_IN_BH - struct work_struct bh; -#endif - amb_cq cq; amb_txq txq; amb_rxq rxq[NUM_RX_POOLS]; - struct semaphore vcc_sf; + struct mutex vcc_sf; amb_tx_info txer[NUM_VCS]; struct atm_vcc * rxer[NUM_VCS]; unsigned int tx_avail; @@ -656,17 +652,6 @@ typedef struct amb_dev amb_dev; #define AMB_DEV(atm_dev) ((amb_dev *) (atm_dev)->dev_data) #define AMB_VCC(atm_vcc) ((amb_vcc *) (atm_vcc)->dev_data) -/* the microcode */ - -typedef struct { - u32 start; - unsigned int count; -} region; - -static region ucode_regions[]; -static u32 ucode_data[]; -static u32 ucode_start; - /* rate rounding */ typedef enum { diff --git a/drivers/atm/atmsar11.data b/drivers/atm/atmsar11.data deleted file mode 100644 index 5dc8a7613f5..00000000000 --- a/drivers/atm/atmsar11.data +++ /dev/null @@ -1,2063 +0,0 @@ -/* - Madge Ambassador ATM Adapter microcode. - Copyright (C) 1995-1999 Madge Networks Ltd. - - This microcode data is placed under the terms of the GNU General - Public License. The GPL is contained in /usr/doc/copyright/GPL on a - Debian system and in the file COPYING in the Linux kernel source. - - We would prefer you not to distribute modified versions without - consultation and not to ask for assembly/other microcode source. -*/ - - 0x401a6800, - 0x00000000, - 0x335b007c, - 0x13600005, - 0x335b1000, - 0x3c1aa0c0, - 0x375a0180, - 0x03400008, - 0x00000000, - 0x1760fffb, - 0x335b4000, - 0x401a7000, - 0x13600003, - 0x241b0fc0, - 0xaf9b4500, - 0x25080008, - 0x03400008, - 0x42000010, - 0x8f810c90, - 0x32220002, - 0x10400003, - 0x3c03a0d1, - 0x2463f810, - 0x0060f809, - 0x24210001, - 0x1000001a, - 0xaf810c90, - 0x82020011, - 0xaf900c48, - 0x0441000a, - 0x34420080, - 0x967d0002, - 0x96020012, - 0x00000000, - 0x105d0011, - 0x00000000, - 0x04110161, - 0xa6620002, - 0x1000000d, - 0xae62000c, - 0x34848000, - 0xa2020011, - 0x4d01ffff, - 0x00000000, - 0x8f834c00, - 0x00000000, - 0xaf830fec, - 0x00e0f809, - 0x03e03821, - 0x00041400, - 0x0440fff7, - 0x00000000, - 0xaf80460c, - 0x8e100008, - 0x4d01ffff, - 0x00000000, - 0x8f834c00, - 0x4900001d, - 0xaf830fec, - 0x8f820cbc, - 0x8f9d0c4c, - 0x24420001, - 0x97be0000, - 0xaf820cbc, - 0x13c00009, - 0xaca200d8, - 0xa7a00000, - 0x3c0100d1, - 0x003e0825, - 0x9422002c, - 0x0411013f, - 0xa4220002, - 0xac22000c, - 0xac200010, - 0x8f9e0c54, - 0x27bd0002, - 0x17be0002, - 0x8ca200c0, - 0x8f9d0c50, - 0x8f970fc8, - 0xaf9d0c4c, - 0x12e20005, - 0x87804002, - 0x3c02a0d1, - 0x2442f94c, - 0x0040f809, - 0x00000000, - 0x00e0f809, - 0x03e03821, - 0x4500ffdc, - 0x8e11000c, - 0x3c1300d1, - 0x00111102, - 0x2c430400, - 0x1060ffb9, - 0x00021180, - 0x02629821, - 0x8e76003c, - 0x32220008, - 0x1440ffb7, - 0x8e770034, - 0x8e750030, - 0x3c03cfb0, - 0x16c00003, - 0x02d5102b, - 0x041100be, - 0x00000000, - 0x1040ffa6, - 0x00701826, - 0x4d01ffff, - 0x00000000, - 0x8f824c00, - 0xaf974c00, - 0xaf820fec, - 0xac760010, - 0x02609021, - 0x32220002, - 0x10400007, - 0x8f944a00, - 0x9602003a, - 0x34840004, - 0x14400003, - 0xaf820fbc, - 0x3c029000, - 0xaf820fbc, - 0x8e100008, - 0x32943f00, - 0x8e11000c, - 0x2694ff00, - 0x12800073, - 0x3c1300d1, - 0x49010071, - 0x32370008, - 0x16e0006f, - 0x00111102, - 0x2c430400, - 0x1060006c, - 0x0002b980, - 0x00041740, - 0x0440003a, - 0x02779821, - 0x12720023, - 0x26d60030, - 0xae56003c, - 0x8e76003c, - 0x8e770034, - 0x8e750030, - 0x3c03cfb0, - 0x16c00003, - 0x02d5102b, - 0x04110091, - 0x00000000, - 0x10400060, - 0x2e821000, - 0x14400009, - 0x00701826, - 0x4d01ffff, - 0x00000000, - 0x8f824c00, - 0xaf974c00, - 0xac760010, - 0xae420034, - 0x1000ffd0, - 0xaf80460c, - 0x00e0f809, - 0x03e03821, - 0x3c03cfb0, - 0x00701826, - 0xae460034, - 0x4d01ffff, - 0x00000000, - 0x8f824c00, - 0xaf974c00, - 0xaf820fec, - 0xac760010, - 0x1000ffc3, - 0xaf80460c, - 0x02d5102b, - 0x10400042, - 0x3c17cfb0, - 0x2e821000, - 0x14400006, - 0x02f0b826, - 0x4d01ffff, - 0x00000000, - 0xaef60010, - 0x1000ffb8, - 0xaf80460c, - 0x00e0f809, - 0x03e03821, - 0x4d01ffff, - 0x00000000, - 0x8f824c00, - 0xaf864c00, - 0xaef60010, - 0xaf820fec, - 0x1000ffae, - 0xaf80460c, - 0x3084fffb, - 0x8e570038, - 0x3242ffc0, - 0x00021182, - 0xa7820fb8, - 0xaf970fb4, - 0x865d002a, - 0x865e0008, - 0xa79d0fba, - 0x279d0f18, - 0x33de0060, - 0x03bee821, - 0x001ef0c2, - 0x03bee821, - 0x8f970c58, - 0x4d01ffff, - 0x00000000, - 0x8f834c00, - 0x8fa2001c, - 0x12e30003, - 0x3c030c40, - 0x3c1ec000, - 0xaf9e0fbc, - 0xac620fb4, - 0x8fa30018, - 0x2442000c, - 0x14430002, - 0xaf80460c, - 0x8fa20014, - 0xae40003c, - 0xafa2001c, - 0x8e76003c, - 0x8e770034, - 0x8e750030, - 0x3c03cfb0, - 0x16c00003, - 0x02d5102b, - 0x0411003c, - 0x00000000, - 0x00701826, - 0x4d01ffff, - 0x00000000, - 0xaca500e4, - 0x10400032, - 0xaf974c00, - 0x1000ff7f, - 0xac760010, - 0x00041740, - 0x04400007, - 0x26d60030, - 0xae56003c, - 0x00e0f809, - 0x03e03821, - 0xaf80460c, - 0x1000ff39, - 0xae460034, - 0x8e570038, - 0x3242ffc0, - 0x00021182, - 0xa7820fb8, - 0xaf970fb4, - 0x8f970c58, - 0x00e0f809, - 0x03e03821, - 0x12e60003, - 0x3c030c40, - 0x3c02c000, - 0xaf820fbc, - 0x865d002a, - 0x865e0008, - 0xa79d0fba, - 0x279d0f18, - 0x33de0060, - 0x03bee821, - 0x001ef0c2, - 0x03bee821, - 0x8fa2001c, - 0x4d01ffff, - 0x00000000, - 0x8f974c00, - 0xac620fb4, - 0x3084fffb, - 0x8fa30018, - 0x2442000c, - 0x14430002, - 0xaf80460c, - 0x8fa20014, - 0xae40003c, - 0xafa2001c, - 0x4d01ffff, - 0x00000000, - 0xaca500e4, - 0x1000ff13, - 0xaf974c00, - 0x00e0f809, - 0x03e03821, - 0x1000ff0f, - 0x00000000, - 0x1040005b, - 0x867e0008, - 0x279d0f18, - 0x33de0060, - 0x03bee821, - 0x001e10c2, - 0x03a2e821, - 0x8fb70008, - 0x8fa2000c, - 0x8ef60004, - 0x12e20028, - 0x86620008, - 0x82030010, - 0x00021740, - 0x04410019, - 0x24630001, - 0x10600017, - 0x3c02d1b0, - 0x00501026, - 0x4d01ffff, - 0x00000000, - 0x8f9e4c00, - 0xac560010, - 0x26d6fffe, - 0x86020010, - 0x3c03cfb0, - 0x34632000, - 0xa662002a, - 0x8ee20000, - 0x26f70008, - 0xae620038, - 0x8fa20020, - 0xafb70008, - 0x2417ffff, - 0x02c2a821, - 0x4d01ffff, - 0x00000000, - 0xaf9e4c00, - 0x03e00008, - 0xae750030, - 0x8ee20000, - 0x26f70008, - 0xae620038, - 0x8fa20020, - 0xafb70008, - 0x2417ffff, - 0xa677002a, - 0x02c2a821, - 0x3c03cfb0, - 0x03e00008, - 0xae750030, - 0x001e18c2, - 0x00651821, - 0x8c6300c8, - 0x8fa20010, - 0x00000000, - 0x0062b023, - 0x1ec00003, - 0x8fa10004, - 0x12c0001b, - 0x0022b023, - 0x2ec30041, - 0x14600002, - 0x3c150040, - 0x24160040, - 0x00161e80, - 0x00031882, - 0x00751825, - 0x4d01ffff, - 0x00000000, - 0x8f954c00, - 0x001eb840, - 0x00771821, - 0xac624d00, - 0x00561021, - 0x14410002, - 0x27830d00, - 0x8fa20000, - 0x02e3b821, - 0xafa20010, - 0x02d71821, - 0xafa3000c, - 0x4d01ffff, - 0x00000000, - 0x8ef60004, - 0x1000ffb5, - 0xaf954c00, - 0x3c16dead, - 0xae76003c, - 0xae600038, - 0x26d5ffff, - 0x00001021, - 0x03e00008, - 0xae750030, - 0x2c430ab2, - 0x10600005, - 0x2c4324b2, - 0x10000004, - 0x24020ab2, - 0x10000002, - 0x240224b1, - 0x1060fffd, - 0x304301ff, - 0x00031840, - 0x3c1da0d1, - 0x27bdd6cc, - 0x007d1821, - 0x94630000, - 0x0002ea42, - 0x00031c00, - 0x27bdfffb, - 0x03e00008, - 0x03a31006, - 0x24030fc0, - 0xaf834500, - 0x10000002, - 0x01206021, - 0x3c0ccfb0, - 0x11e00056, - 0x01896026, - 0x85fe0000, - 0x00000000, - 0x13c00047, - 0x3c02cfb0, - 0x07c0002d, - 0x001e1f80, - 0x04610034, - 0x001e1fc0, - 0x04600009, - 0x3c02d3b0, - 0x00e0f809, - 0x03e03821, - 0x4d01ffff, - 0x00000000, - 0x8f864c00, - 0x8f990fec, - 0x1000000b, - 0xaf994c00, - 0x01e27826, - 0x00e0f809, - 0x03e03821, - 0x4d01ffff, - 0x00000000, - 0x8f864c00, - 0xaf994c00, - 0xadef2010, - 0x3c02d3b0, - 0x01e27826, - 0x8f820fc0, - 0x8f830fc4, - 0xaf824d00, - 0x8de20004, - 0xa5e00000, - 0xac620000, - 0x8c620000, - 0x24020380, - 0xaf824d00, - 0x8f824d00, - 0x8f820f14, - 0x24630004, - 0x14620002, - 0x2419ffff, - 0x8f830f10, - 0xaca500e4, - 0xaf830fc4, - 0x4d01ffff, - 0x00000000, - 0x8f824c80, - 0x1000001f, - 0xade2003c, - 0x00e0f809, - 0x03e03821, - 0x4d01ffff, - 0x00000000, - 0xa5e00000, - 0x8f864c00, - 0x15800022, - 0xaf8f4540, - 0x10000017, - 0x01e27826, - 0x00e0f809, - 0x03e03821, - 0x4d01ffff, - 0x00000000, - 0x8f864c00, - 0xaf994c00, - 0xadef2010, - 0x3c02cfb0, - 0x01e27826, - 0xa5e00000, - 0x4d01ffff, - 0x00000000, - 0x10000007, - 0x8f994c00, - 0x00e0f809, - 0x03e03821, - 0x4d01ffff, - 0x00000000, - 0x8f864c00, - 0x8f990fec, - 0x1580000a, - 0xaf8f4500, - 0x00007821, - 0x10000014, - 0xaf190014, - 0x00e0f809, - 0x03e03821, - 0x4d01ffff, - 0x00000000, - 0x1180fff8, - 0x8f864c00, - 0x85220000, - 0x01207821, - 0x0440000a, - 0x8d290008, - 0x130b0004, - 0x000c1602, - 0xaf190014, - 0x8d790014, - 0x0160c021, - 0xaf994c00, - 0xad8e4010, - 0x3042003f, - 0x01c27021, - 0x00041780, - 0x0440018b, - 0x8f824a00, - 0x30818000, - 0x30420004, - 0x1440ff8d, - 0x8d4b0000, - 0x1020000c, - 0x30847fff, - 0x8f820c48, - 0x0120f021, - 0x24430034, - 0x8c5d000c, - 0x24420004, - 0xafdd000c, - 0x1462fffc, - 0x27de0004, - 0xa5210000, - 0x1000ff82, - 0x25080008, - 0x11600058, - 0x00000000, - 0x857d0008, - 0x8d63000c, - 0x9562000a, - 0x8d410004, - 0x07a10026, - 0x00621821, - 0xa563000a, - 0x00031c02, - 0x041101a0, - 0x000318c0, - 0x001d16c0, - 0x0441001f, - 0x27a20080, - 0x00021cc0, - 0x0461000e, - 0x0040e821, - 0x27bd0080, - 0x95620000, - 0x95630002, - 0x3442000c, - 0xad22000c, - 0x24020100, - 0xa5220010, - 0x9562002c, - 0xa5230014, - 0xa5220012, - 0xa5200016, - 0x34028000, - 0xa5220000, - 0xa57d0008, - 0x07a0000c, - 0x8f820c4c, - 0x8f830c50, - 0x2441ffe8, - 0x0023f02b, - 0x13c00002, - 0x00201021, - 0x24420400, - 0x945e0000, - 0x2441fffe, - 0x17c0fff9, - 0xad620010, - 0xa44b0000, - 0x142b001c, - 0xad400000, - 0xad400004, - 0x254a0008, - 0x3142007f, - 0x1440000e, - 0x00041780, - 0x04410003, - 0x8f820fe0, - 0x10000006, - 0x34840001, - 0x34840002, - 0x24420008, - 0x34421000, - 0x38421000, - 0xaf820fe0, - 0x354a0100, - 0x394a0100, - 0x39420080, - 0xaf820fe4, - 0x001d14c0, - 0x04410003, - 0x33a2efff, - 0x1000ff3c, - 0xa5620008, - 0x07a0009f, - 0x33a2fffe, - 0x10000021, - 0xa5620008, - 0x8d620024, - 0x001d1cc0, - 0x04610004, - 0xad420000, - 0x33a3efff, - 0x1000ff31, - 0xa5630008, - 0x07a00005, - 0x33a3fffe, - 0xa5630008, - 0x8d4b0000, - 0x1000ffaa, - 0x00000000, - 0x1000008e, - 0x25080008, - 0x254a0008, - 0x3142007f, - 0x1440000e, - 0x00041780, - 0x04410003, - 0x8f820fe0, - 0x10000006, - 0x34840001, - 0x34840002, - 0x24420008, - 0x34421000, - 0x38421000, - 0xaf820fe0, - 0x354a0100, - 0x394a0100, - 0x39420080, - 0xaf820fe4, - 0x11000003, - 0x8d4b0000, - 0x1000ff93, - 0x2508fff8, - 0x8f820fd8, - 0x8f830fdc, - 0x8f810fd4, - 0x1062001d, - 0x24620008, - 0x4d01ffff, - 0x00000000, - 0x8f8c4c00, - 0x847f0000, - 0x3c1e00d1, - 0x33fd03ff, - 0x001d5980, - 0x017e5821, - 0x857e0008, - 0x001de900, - 0x001e0f00, - 0x03e1f825, - 0x07e00003, - 0xaf820fdc, - 0x879e0ca0, - 0x278b0c98, - 0x07c10042, - 0x3c020840, - 0x3c01f7b0, - 0x8d620020, - 0x00230826, - 0xac220000, - 0x8c620004, - 0x94630002, - 0x2442fff8, - 0x00431021, - 0x1000004e, - 0xad620020, - 0x8f820fd0, - 0x87830ca0, - 0x14220007, - 0x278b0c98, - 0x41000051, - 0x3c018000, - 0xaca100e0, - 0x8ca100c4, - 0x00000000, - 0x1022004c, - 0x0022e823, - 0x8f9f0f0c, - 0x07a10002, - 0xaf810fd4, - 0x03e2e823, - 0x2fa30041, - 0x14600002, - 0x3c1e0040, - 0x241d0040, - 0x001d1e80, - 0x00031882, - 0x007e1825, - 0x4d01ffff, - 0x00000000, - 0x8f8c4c00, - 0xac624cc0, - 0x005d1021, - 0x145f0002, - 0x27830cc0, - 0x8f820f08, - 0x03a3f021, - 0xaf820fd0, - 0xaf9e0fd8, - 0x4d01ffff, - 0x00000000, - 0x1000ffc3, - 0x24620008, - 0x8d63000c, - 0x8d7d0010, - 0xa563000a, - 0x13a00002, - 0x00031c02, - 0xa7a00000, - 0x000318c0, - 0x041100ef, - 0x00681821, - 0x4d01ffff, - 0x00000000, - 0x8f820c44, - 0x8f830c40, - 0xad620010, - 0xa5630004, - 0xa5630006, - 0x10000021, - 0xaf8c4c00, - 0xa57d0000, - 0x8c7d0004, - 0x94630002, - 0xac5d4c40, - 0x27a20008, - 0xad620018, - 0x03a3e821, - 0x27bdfff4, - 0xad7d001c, - 0x27bd0004, - 0xad7d0020, - 0x37c18001, - 0x001e17c0, - 0x0441ffe0, - 0xa5610008, - 0x4d01ffff, - 0x00000000, - 0x8f820c44, - 0x8f830c40, - 0xad620010, - 0xa5630004, - 0xa5630006, - 0x8f820fd8, - 0x8f830fdc, - 0x4d01ffff, - 0x00000000, - 0x1462ff95, - 0x24620008, - 0xaf8c4c00, - 0x87830ca0, - 0x278b0c98, - 0x0461fe97, - 0x00041700, - 0x04400005, - 0x95620000, - 0x11780006, - 0x00000000, - 0xaf0e0010, - 0xa70d0004, - 0x3084fff7, - 0x956d0004, - 0x8d6e0010, - 0x25adffd0, - 0x05a1fe8f, - 0xad22000c, - 0x3c0cffb0, - 0x01896026, - 0x000d1822, - 0x25ad0030, - 0x8d7e0018, - 0x8d61001c, - 0x4d01ffff, - 0x00000000, - 0x103e0036, - 0x8f9d4c00, - 0x3c010840, - 0xac3e4c40, - 0x27de0008, - 0x11a00017, - 0xad7e0018, - 0x000df600, - 0x019e6025, - 0x4d01ffff, - 0x00000000, - 0xad8e4010, - 0x8f8d0c40, - 0x957e0006, - 0x8f8e0c44, - 0x03cdf021, - 0xa57e0006, - 0x000cf782, - 0x000c0e02, - 0x03c1f021, - 0x001e0f80, - 0x000c6200, - 0x000c6202, - 0x01816025, - 0x33de003c, - 0x019e6021, - 0x34010001, - 0x10000008, - 0xa5210000, - 0x957e0006, - 0x4d01ffff, - 0x00000000, - 0x8f8d0c40, - 0x8f8e0c44, - 0x03cdf021, - 0xa57e0006, - 0x4d01ffff, - 0x00000000, - 0x01a3f02b, - 0x17c00008, - 0x0003f600, - 0x01a36823, - 0x019e6025, - 0x01896026, - 0x4d01fff7, - 0x00000000, - 0x1000fe58, - 0xaf9d4c00, - 0x8d7e0018, - 0x8d61001c, - 0x00000000, - 0x143effce, - 0x006d1823, - 0x4d01ffff, - 0x00000000, - 0x2c610008, - 0x10200017, - 0x95610008, - 0x00000000, - 0x0001ff80, - 0x07e0000b, - 0x34210002, - 0x006d1821, - 0x00031e00, - 0x01836025, - 0x01896026, - 0x240d002c, - 0xa5610008, - 0x4d01ffff, - 0x00000000, - 0x1000fe40, - 0xaf9d4c00, - 0x3c1f0c40, - 0xaffe4fa8, - 0x3021fffd, - 0xa5610008, - 0x3c0cd3cf, - 0x358ce000, - 0x10000008, - 0x34030002, - 0x3c1f0c40, - 0xaffe4fa8, - 0x11a0fff9, - 0x000df600, - 0x34030003, - 0x019e6025, - 0x01896026, - 0x34840008, - 0x34420002, - 0xad22000c, - 0x95620006, - 0xa5230000, - 0xad220038, - 0x4d01ffff, - 0x00000000, - 0x857e0008, - 0x8f820fa8, - 0x97830fac, - 0xad220004, - 0x33c17fff, - 0xad600010, - 0xa5610008, - 0x1060fe20, - 0xaf9d4c00, - 0xa57e0008, - 0x00031900, - 0x30633ff0, - 0xa5630000, - 0x8f820fb0, - 0x3c030840, - 0xac624c40, - 0x24430008, - 0xad630018, - 0x97830fae, - 0x2442fff4, - 0x00621821, - 0xad63001c, - 0x4d01ffff, - 0x00000000, - 0x8f8d0c40, - 0x8f830c44, - 0xa56d0004, - 0xa56d0006, - 0xad630010, - 0x1000fe0a, - 0xaf9d4c00, - 0x8f820fe0, - 0x00040fc0, - 0x8c430000, - 0x0421001b, - 0x8f9f0fe4, - 0x8c5d0004, - 0xac400004, - 0x1060000e, - 0xac400000, - 0x00000000, - 0x94620028, - 0x00000000, - 0x005f1020, - 0x8c410004, - 0x00000000, - 0x10200003, - 0xac430004, - 0x10000002, - 0xac230024, - 0xac430000, - 0x17a3fff4, - 0x8c630024, - 0x8f820fe0, - 0x3bff0080, - 0x24420008, - 0x34421000, - 0x38421000, - 0xaf820fe0, - 0xaf9f0fe4, - 0x1000fe57, - 0x3084fffe, - 0x10600010, - 0x00000000, - 0x947d0028, - 0x00000000, - 0x03bfe820, - 0x8fa10004, - 0xafa30004, - 0x10200003, - 0x8c5e0004, - 0x10000002, - 0xac230024, - 0xafa30000, - 0x8c610024, - 0x17c3fe48, - 0xac410000, - 0xac400004, - 0xac400000, - 0x1000fe44, - 0x3084fffd, - 0x2c620100, - 0x1440000e, - 0x006a1021, - 0x3143007f, - 0x01431823, - 0x00431823, - 0x3062007f, - 0xa5620028, - 0x00621823, - 0x00031902, - 0x8f820fe0, - 0x2463fff8, - 0x00621821, - 0x34631000, - 0x10000003, - 0x38631000, - 0x34430100, - 0x38630100, - 0x8c620004, - 0x00000000, - 0x10400003, - 0xac6b0004, - 0x03e00008, - 0xac4b0024, - 0x03e00008, - 0xac6b0000, - 0x00000002, - 0xa0d0e000, - 0x00000000, - 0x00001000, - 0x00000006, - 0x00000008, - 0x00000000, - 0x00000008, - 0x00000002, - 0xa0d0d648, - 0x00000000, - 0x00000888, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x24313200, - 0x24313200, - 0x24313200, - 0x00000000, - 0x244d4352, - 0x2420436f, - 0x70797269, - 0x67687420, - 0x28632920, - 0x4d616467, - 0x65204e65, - 0x74776f72, - 0x6b73204c, - 0x74642031, - 0x3939352e, - 0x20416c6c, - 0x20726967, - 0x68747320, - 0x72657365, - 0x72766564, - 0x2e004d61, - 0x64676520, - 0x416d6261, - 0x73736164, - 0x6f722076, - 0x312e3031, - 0x00000000, - 0x00000001, - 0x00000001, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0xfff04000, - 0x00000000, - 0x0c343e2d, - 0x00000000, - 0x3c1ca0d1, - 0x279c5638, - 0x3c1da0d1, - 0x27bddfd0, - 0x3c08a0d1, - 0x2508dfd0, - 0xaf878008, - 0x0c343c13, - 0x00000000, - 0x24040003, - 0x0097000d, - 0x3c08bfc0, - 0x35080230, - 0x8d080000, - 0x00000000, - 0x01000008, - 0x00000000, - 0x27bdffd0, - 0xafbf001c, - 0xafb10018, - 0xafb00014, - 0x3c11fff0, - 0x00008021, - 0x3c180056, - 0x37183b79, - 0x26190200, - 0x17200002, - 0x0319001a, - 0x0007000d, - 0x2401ffff, - 0x17210005, - 0x00000000, - 0x3c018000, - 0x17010002, - 0x00000000, - 0x0006000d, - 0x00001012, - 0x00101840, - 0x3c05a0d1, - 0x24a5d6cc, - 0x00a32021, - 0xa4820000, - 0x26100001, - 0x2a010200, - 0x1420ffea, - 0x00000000, - 0x3c06a0d1, - 0x24c6f9e4, - 0x3c07a0d1, - 0x24e7d648, - 0xace60000, - 0x3c08a0d1, - 0x2508fb14, - 0xace80004, - 0x3c09a0d1, - 0x2529fc94, - 0xace90008, - 0x3c0aa0d1, - 0x254afcd4, - 0xacea000c, - 0x3c0ba0d1, - 0x256bfba8, - 0xaceb0010, - 0x3c0ca0d1, - 0x258cfbc4, - 0xacec0014, - 0x3c0da0d1, - 0x25adfbe0, - 0xaced0018, - 0x3c0ea0d1, - 0x25cefbfc, - 0xacee001c, - 0x3c0fa0d1, - 0x25effc18, - 0xacef0020, - 0x3c18a0d1, - 0x2718fc34, - 0xacf80024, - 0x3c19a0d1, - 0x2739fc50, - 0xacf90028, - 0x3c02a0d1, - 0x2442fc60, - 0xace2002c, - 0x3c03a0d1, - 0x2463fc70, - 0xace30030, - 0x3c04a0d1, - 0x2484fc80, - 0xace40034, - 0x3c05a0d1, - 0x24a5fcb4, - 0xace50038, - 0x3c06a0d1, - 0x24c6fe08, - 0xace6003c, - 0x3c08a0d1, - 0x2508fe90, - 0xace80040, - 0x3c09a0d1, - 0x2529fa38, - 0xace90044, - 0x3c0aa0d1, - 0x254afa74, - 0xacea0048, - 0x24100013, - 0x3c0ba0d1, - 0x256bf9d8, - 0x00106080, - 0x3c0ea0d1, - 0x25ced648, - 0x01cc6821, - 0xadab0000, - 0x26100001, - 0x2a010020, - 0x1420fff6, - 0x00000000, - 0x8f988000, - 0x00000000, - 0xaf000100, - 0x8f828000, - 0x241903ff, - 0xa4590202, - 0x00008021, - 0x8f868000, - 0x24030fff, - 0x00102040, - 0x24c70380, - 0x00e42821, - 0xa4a30000, - 0x26100001, - 0x2a010008, - 0x1420fff7, - 0x00000000, - 0x8f898000, - 0x34089c40, - 0xad2803a0, - 0x8f8b8000, - 0x3c0a00ff, - 0x354affff, - 0xad6a03a4, - 0x00008021, - 0x8f8f8000, - 0x240c0fff, - 0x00106840, - 0x25f80300, - 0x030d7021, - 0xa5cc0000, - 0x26100001, - 0x2a010008, - 0x1420fff7, - 0x00000000, - 0x8f828000, - 0x34199c40, - 0xac590320, - 0x8f848000, - 0x3c0300ff, - 0x3463ffff, - 0xac830324, - 0x8f868000, - 0x240502ff, - 0xa4c50202, - 0x3c08a0c0, - 0x35080180, - 0x3c09a0d1, - 0x2529d5b8, - 0x250a0028, - 0x8d0b0000, - 0x8d0c0004, - 0xad2b0000, - 0xad2c0004, - 0x25080008, - 0x150afffa, - 0x25290008, - 0x40026000, - 0x00000000, - 0xafa20028, - 0x24030022, - 0x3c04a0e0, - 0x34840014, - 0xac830000, - 0x8fa50028, - 0x00000000, - 0x34a61001, - 0x00c01021, - 0xafa60028, - 0x3c07ffbf, - 0x34e7ffff, - 0x00c73824, - 0x00e01021, - 0xafa70028, - 0x40876000, - 0x00000000, - 0x3c080002, - 0x3508d890, - 0x3c09fffe, - 0x35290130, - 0xad280000, - 0x8faa0028, - 0x3c0bf000, - 0x014b5825, - 0x01601021, - 0xafab0028, - 0x01606021, - 0x408c6000, - 0x00000000, - 0x00008021, - 0x00107080, - 0x022e7821, - 0xade00000, - 0x26100001, - 0x2a010400, - 0x1420fffa, - 0x00000000, - 0x24180001, - 0x3c19a0e8, - 0xaf380000, - 0x24020011, - 0x3c03a0f0, - 0x34630017, - 0xa0620000, - 0x3c04f0eb, - 0x34840070, - 0x3c05fff0, - 0x34a54a00, - 0xaca40000, - 0x3c06fceb, - 0x34c60070, - 0xaca60000, - 0x3c07fff0, - 0x34e74700, - 0xace00000, - 0x00008021, - 0x3c08fff0, - 0x35080fc0, - 0x3c09fff0, - 0x35294500, - 0xad280000, - 0x26100001, - 0x2a010004, - 0x1420fff8, - 0x00000000, - 0x00008021, - 0x3c0adead, - 0x00105980, - 0x3c0100d1, - 0x002b0821, - 0xac2a003c, - 0x3c0100d1, - 0x002b0821, - 0xac200030, - 0x3c0100d1, - 0x002b0821, - 0xac200038, - 0x240dffff, - 0x3c0100d1, - 0x002b0821, - 0xac2d0014, - 0x00107100, - 0x3c0100d1, - 0x002b0821, - 0xa42e0000, - 0x3c0100d1, - 0x002b0821, - 0xa4200004, - 0x24180020, - 0x3c0100d1, - 0x002b0821, - 0xa4380008, - 0x3c0100d1, - 0x002b0821, - 0xac200010, - 0x26100001, - 0x2a010400, - 0x1420ffe0, - 0x00000000, - 0x00008021, - 0x001018c0, - 0x3c05a0d1, - 0x24a5e000, - 0x00a32021, - 0xac800000, - 0x3c07a0d1, - 0x24e7e000, - 0x24e80004, - 0x01033021, - 0xacc00000, - 0x26100001, - 0x2a010009, - 0x1420fff3, - 0x00000000, - 0x24090380, - 0x3c0afff0, - 0x354a4d00, - 0xad490000, - 0x3c0ca080, - 0x358c009c, - 0xad800000, - 0x3c0da080, - 0x35ad00a0, - 0xada00000, - 0x3c0e1100, - 0x3c0fa080, - 0x35ef00a8, - 0xadee0000, - 0x41010003, - 0x00000000, - 0x4100ffff, - 0x00000000, - 0x3c18a080, - 0x371800e0, - 0x8f190000, - 0x3c01a0d1, - 0xac39d6c8, - 0x0c343d43, - 0x03202021, - 0x8fb00014, - 0x8fbf001c, - 0x8fb10018, - 0x03e00008, - 0x27bd0030, - 0x0080b821, - 0x3c1cfff0, - 0xa3800c84, - 0xa3800c88, - 0x8f904400, - 0x00002021, - 0xaf800cbc, - 0x240200a8, - 0x27830f00, - 0x2c5d0040, - 0x17a0000c, - 0x3c1dffb0, - 0x03a3e826, - 0xafb74000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x4d01ffff, - 0x00000000, - 0x2442ffc0, - 0x24630040, - 0x1000fff3, - 0x26f70040, - 0x1040000d, - 0x00000000, - 0x0002ee00, - 0x3c010040, - 0x03a1e825, - 0x3c01fff0, - 0x03a1e826, - 0x03a3e826, - 0xafb74000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x4d01ffff, - 0x00000000, - 0x3c05a080, - 0x8f820f08, - 0x00000000, - 0xaf820fd4, - 0xaf820fd0, - 0xaca200c4, - 0x8f820f10, - 0x00000000, - 0x00021d82, - 0xaf830fc0, - 0x00031d80, - 0x00431023, - 0x3c01a080, - 0x00411025, - 0xaf820fc4, - 0xaf820f10, - 0x8f820f14, - 0x00000000, - 0x00431023, - 0x3c01a080, - 0x00411025, - 0xaf820f14, - 0x24030003, - 0x279d0f18, - 0x24be00c8, - 0x27810d00, - 0x8fa20000, - 0x00000000, - 0xafa20010, - 0xafc20000, - 0xafa10008, - 0xafa1000c, - 0x8fa20014, - 0x00000000, - 0xafa2001c, - 0x27bd0024, - 0x27de0004, - 0x24210040, - 0x1460fff3, - 0x2463ffff, - 0x8f820f00, - 0x00000000, - 0xaf820fc8, - 0xaca200c0, - 0x27820800, - 0x2403000f, - 0xac400000, - 0x24420004, - 0x1460fffd, - 0x2463ffff, - 0x8f830fc0, - 0x00000000, - 0xaf834d00, - 0x8f834d00, - 0x8f830f14, - 0x8f820f10, - 0x2463fffc, - 0xac400000, - 0x1443fffe, - 0x24420004, - 0x24020380, - 0xaf824d00, - 0x279d0f18, - 0x27a10090, - 0x8fa20014, - 0x8fa30018, - 0x00000000, - 0x00621823, - 0x2c7f0040, - 0x17e00009, - 0x3c1f0040, - 0x37ff0800, - 0x03a0f021, - 0x4d01ffff, - 0x00000000, - 0xafe20000, - 0x24420040, - 0x1000fff6, - 0x2463ffc0, - 0x10600006, - 0x37ff0800, - 0x00031e00, - 0x03e3f825, - 0x4d01ffff, - 0x00000000, - 0xafe20000, - 0x27bd0024, - 0x17a1ffe8, - 0x00000000, - 0x00003821, - 0x8fc20014, - 0x8fc30018, - 0x00000000, - 0x00621823, - 0x2c7f0040, - 0x13e00004, - 0x3c1f0040, - 0x00030e00, - 0x10000002, - 0x03e1f825, - 0x24030040, - 0x37ff0800, - 0x241e03e7, - 0x00000821, - 0x4d01ffff, - 0x00000000, - 0xafe20000, - 0x00230821, - 0x4900fffb, - 0x00000000, - 0x87804002, - 0x17c0fff8, - 0x27deffff, - 0x14e00004, - 0x34e74000, - 0x03e7f825, - 0x1000fff0, - 0xaf810c60, - 0xaf810c5c, - 0x3c01a0d1, - 0x8c22d6c8, - 0x00000000, - 0x3c01a080, - 0xac2200e0, - 0x3c01a080, - 0x8c2000e0, - 0xaf800fb4, - 0xa7800fb8, - 0xa7800fba, - 0xa7800fbc, - 0xa7800fbe, - 0x27820cc0, - 0xaf820fdc, - 0xaf820fd8, - 0x3c02a0d1, - 0x2442dacc, - 0xaf820c4c, - 0xaf820c50, - 0x24420400, - 0xaf820c54, - 0x2402001e, - 0x3c03fff0, - 0x247d0040, - 0xac7d0008, - 0x03a01821, - 0x1440fffc, - 0x2442ffff, - 0x3c1dfff0, - 0xac7d0008, - 0x3c02c704, - 0x3442dd7b, - 0xaf820c58, - 0x3c070000, - 0x24e70158, - 0x08343fa9, - 0x00000000, - 0x8e620038, - 0x00000000, - 0x14400005, - 0x8f830c94, - 0x12a00022, - 0x24630001, - 0x10000020, - 0xaf830c94, - 0xaf820fb4, - 0x3262ffc0, - 0x00021182, - 0x8663002a, - 0xa7820fb8, - 0x3c02a000, - 0xaf820fbc, - 0xa7830fba, - 0x867e0008, - 0x279d0f18, - 0x33de0060, - 0x03bee821, - 0x001ef0c2, - 0x03bee821, - 0x8fa2001c, - 0x3c030c40, - 0x4d01ffff, - 0x00000000, - 0x8f974c00, - 0xac620fb4, - 0x8fa30018, - 0x2442000c, - 0x14430003, - 0x00000000, - 0x8fa20014, - 0x00000000, - 0xafa2001c, - 0x4d01ffff, - 0x00000000, - 0xaca500e4, - 0xaf974c00, - 0x03e00008, - 0xae60003c, - 0x3c0da0d1, - 0x25add500, - 0x11a00021, - 0x00000000, - 0x8da90000, - 0x00000000, - 0x1120001d, - 0x00000000, - 0x8daa0004, - 0x8dab0008, - 0x8dac000c, - 0x00094740, - 0x05010004, - 0x00000000, - 0x3c08a0d1, - 0x2508d638, - 0x01485021, - 0x00094780, - 0x05010007, - 0x00000000, - 0x1180000d, - 0x00000000, - 0xad400000, - 0x254a0004, - 0x1000fffb, - 0x258cfffc, - 0x11800007, - 0x00000000, - 0x8d6e0000, - 0x256b0004, - 0xad4e0000, - 0x254a0004, - 0x1000fff9, - 0x258cfffc, - 0x1000ffe1, - 0x25ad0010, - 0x03e00008, - 0x00000000, - 0x3c021040, - 0xac574ff0, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x4d01ffff, - 0x00000000, - 0x8f820ffc, - 0x00000000, - 0x3042001f, - 0x00021080, - 0x3c17a0d1, - 0x02e2b821, - 0x26f7d648, - 0x8ef70000, - 0x00000000, - 0x02e00008, - 0x00000000, - 0x2402ffff, - 0xaf820ffc, - 0x8f970fc8, - 0x3c021040, - 0xac570ff0, - 0x8f820f04, - 0x26f70010, - 0x16e20004, - 0xaf970fc8, - 0x8f970f00, - 0x00000000, - 0xaf970fc8, - 0x4d01ffff, - 0x00000000, - 0x03e00008, - 0x00000000, - 0x3c1fa0d1, - 0x27fff02c, - 0x1000ffed, - 0x8f970ff0, - 0x3c0200d1, - 0x32f703ff, - 0x0017b980, - 0x02e2b825, - 0xaee0003c, - 0x2402ffff, - 0xaee20030, - 0xaee20014, - 0x97830ff4, - 0x97820ff8, - 0x3c1d0000, - 0x27bd0698, - 0xa6e30008, - 0xa6e20002, - 0xaf9f0fe8, - 0x03a0f809, - 0xa6e2002c, - 0x8f9f0fe8, - 0x1000ffd9, - 0xaee2000c, - 0x8f970ff0, - 0x3c0200d1, - 0x32f703ff, - 0x0017b980, - 0x02e2b825, - 0x97820ff4, - 0x3c030000, - 0x24630698, - 0xa6e20002, - 0xaf9f0fe8, - 0x0060f809, - 0xa6e2002c, - 0x8f9f0fe8, - 0x1000ffca, - 0xaee2000c, - 0x8f970ff0, - 0x3c0200d1, - 0x32f703ff, - 0x0017b980, - 0x02e2b825, - 0x97820ff4, - 0x00000000, - 0x96e30008, - 0xa6e20008, - 0x00431026, - 0x30420060, - 0x1040ffbd, - 0x8ee2003c, - 0xaee0003c, - 0x1040ffba, - 0x3c028800, - 0xaf820fbc, - 0x8ee20038, - 0xaee00038, - 0x30630060, - 0x279d0f18, - 0x03a3e821, - 0x000318c2, - 0x03a3e821, - 0x8fa3001c, - 0x1040ffaf, - 0xaf820fb4, - 0x3c020c40, - 0xac430fb4, - 0x8fa20018, - 0x2463000c, - 0x14430003, - 0x00000000, - 0x8fa30014, - 0x00000000, - 0xafa3001c, - 0x4d01ffff, - 0x00000000, - 0x1000ffa2, - 0x00000000, - 0x8f970ff0, - 0x3c0200d1, - 0xa7970fb8, - 0x0017b980, - 0x32f7ffc0, - 0x02e2b821, - 0xaee00030, - 0x3c02dead, - 0x8ee3003c, - 0xaee2003c, - 0x8ee20038, - 0x1060ff95, - 0xaee00038, - 0x3c038800, - 0xaf830fbc, - 0x86e30008, - 0x27970f18, - 0x30630060, - 0x02e3b821, - 0x000318c2, - 0x02e3b821, - 0x8ee3001c, - 0x1040ff8a, - 0xaf820fb4, - 0x3c020c40, - 0xac430fb4, - 0x8ee20018, - 0x2463000c, - 0x14430003, - 0x00000000, - 0x8ee30014, - 0x00000000, - 0xaee3001c, - 0x4d01ffff, - 0x00000000, - 0x1000ff7d, - 0x00000000, - 0x8f820ff0, - 0x8f970ff4, - 0x90410000, - 0x00000000, - 0x00370825, - 0x1000ff76, - 0xa0410000, - 0x8f820ff0, - 0x8f970ff4, - 0x94410000, - 0x00000000, - 0x00370825, - 0x1000ff6f, - 0xa4410000, - 0x8f820ff0, - 0x8f970ff4, - 0x8c410000, - 0x00000000, - 0x00370825, - 0x1000ff68, - 0xac410000, - 0x8f820ff0, - 0x8f970ff4, - 0x90410000, - 0x02e0b827, - 0x00370824, - 0x1000ff61, - 0xa0410000, - 0x8f820ff0, - 0x8f970ff4, - 0x94410000, - 0x02e0b827, - 0x00370824, - 0x1000ff5a, - 0xa4410000, - 0x8f820ff0, - 0x8f970ff4, - 0x8c410000, - 0x02e0b827, - 0x00370824, - 0x1000ff53, - 0xac410000, - 0x8f820ff0, - 0x8f970ff4, - 0x1000ff4f, - 0xa0570000, - 0x8f820ff0, - 0x8f970ff4, - 0x1000ff4b, - 0xa4570000, - 0x8f820ff0, - 0x8f970ff4, - 0x1000ff47, - 0xac570000, - 0x8f820ff0, - 0x00000000, - 0x8c420000, - 0x1000ff42, - 0xaf820ff4, - 0x3c01a0c2, - 0x8c22c000, - 0x00000000, - 0xaf820ff0, - 0x3c01a0c2, - 0x8c22c004, - 0x1000ff3a, - 0xaf820ff4, - 0x3c01a0d1, - 0x8c22d5ac, - 0x00000000, - 0xaf820ff0, - 0x3c01a0d1, - 0x8c22d5b0, - 0x1000ff32, - 0xaf820ff4, - 0x3c02a0f0, - 0xac400000, - 0x90570153, - 0x00000000, - 0xa3970c80, - 0x90570157, - 0x00000000, - 0xa3970c81, - 0x9057015b, - 0x00000000, - 0xa3970c87, - 0x9057015f, - 0x00000000, - 0xa3970c86, - 0x90570163, - 0x00000000, - 0x32f70007, - 0xa3970c85, - 0x90570193, - 0x00000000, - 0xa3970c8b, - 0x90570197, - 0x00000000, - 0xa3970c8a, - 0x9057019b, - 0x00000000, - 0x32f70007, - 0xa3970c89, - 0x9057000b, - 0x00000000, - 0x32f700e0, - 0x00170942, - 0x90570047, - 0x00000000, - 0x32f70078, - 0x00370825, - 0x90570067, - 0x00000000, - 0x32f7000f, - 0x0017b9c0, - 0x00370825, - 0x905700c7, - 0x00000000, - 0x32f7002f, - 0x0017bac0, - 0x00370825, - 0x90570147, - 0x00000000, - 0x32f7001e, - 0x0017bc00, - 0x00370825, - 0x90570183, - 0x00000000, - 0x32f70060, - 0x0017bc00, - 0x00370825, - 0xaf810c8c, - 0x3c021840, - 0x8f970fc8, - 0x00000000, - 0x8f970ff0, - 0x00000000, - 0xac570c80, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x4d01ffff, - 0x00000000, - 0x3c02a0d1, - 0x2442f998, - 0xaf800c90, - 0xaf800c94, - 0x00400008, - 0x00000000, - 0x87970ff0, - 0x3c1300d1, - 0xa6770008, - 0x3c030000, - 0x24630520, - 0xaf9f0fe8, - 0x0060f809, - 0x24020001, - 0x8f9f0fe8, - 0x1040feda, - 0x97970ff0, - 0x27830f18, - 0x00771821, - 0x0017b8c2, - 0x02e3b821, - 0x3c028800, - 0xaf820fbc, - 0x8e620038, - 0xa7800fb8, - 0xaf820fb4, - 0x8ee3001c, - 0x3c020c40, - 0xac430fb4, - 0x8ee20018, - 0x2463000c, - 0x14430004, - 0xaee3001c, - 0x8ee30014, - 0x00000000, - 0xaee3001c, - 0x4d01ffff, - 0x00000000, - 0x1000ffdf, - 0x00000000, - 0x8f820c5c, - 0x8f830c60, - 0xaf820ff0, - 0x1000febe, - 0xaf830ff4, - 0x23890800, - 0x01201821, - 0x2402000f, - 0x206c0040, - 0xac6c0008, - 0x01801821, - 0x1440fffc, - 0x2042ffff, - 0xac690008, - 0x278b0c98, - 0xa5600000, - 0x2403ffff, - 0xad630014, - 0x34020001, - 0x34420020, - 0xa5620008, - 0x278a0e00, - 0x01401021, - 0x00001821, - 0xac400000, - 0x24630004, - 0x2c6c0100, - 0x1580fffc, - 0x24420004, - 0x3c02a0d1, - 0x2442e000, - 0xaf820fe0, - 0x3c1800d1, - 0x01206021, - 0x00006821, - 0x00007821, - 0x00005821, - 0x00004021, - 0x40026000, - 0x00000000, - 0x34424001, - 0x40826000, - 0x3c020000, - 0x244206f8, - 0x00400008, - 0x00000000, diff --git a/drivers/atm/atmsar11.regions b/drivers/atm/atmsar11.regions deleted file mode 100644 index 42252b7c0de..00000000000 --- a/drivers/atm/atmsar11.regions +++ /dev/null @@ -1,6 +0,0 @@ -/* - See copyright and licensing conditions in ambassador.* files. -*/ - { 0x00000080, 993, }, - { 0xa0d0d500, 80, }, - { 0xa0d0f000, 978, }, diff --git a/drivers/atm/atmsar11.start b/drivers/atm/atmsar11.start deleted file mode 100644 index dba55e77d8f..00000000000 --- a/drivers/atm/atmsar11.start +++ /dev/null @@ -1,4 +0,0 @@ -/* - See copyright and licensing conditions in ambassador.* files. -*/ - 0xa0d0f000 diff --git a/drivers/atm/atmtcp.c b/drivers/atm/atmtcp.c index 02ad83d6b56..0e3f8f9dcd2 100644 --- a/drivers/atm/atmtcp.c +++ b/drivers/atm/atmtcp.c @@ -9,8 +9,9 @@ #include <linux/atm_tcp.h> #include <linux/bitops.h> #include <linux/init.h> +#include <linux/slab.h> #include <asm/uaccess.h> -#include <asm/atomic.h> +#include <linux/atomic.h> extern int atm_init_aal5(struct atm_vcc *vcc); /* "raw" AAL5 transport */ @@ -67,7 +68,7 @@ static int atmtcp_send_control(struct atm_vcc *vcc,int type, *(struct atm_vcc **) &new_msg->vcc = vcc; old_test = test_bit(flag,&vcc->flags); out_vcc->push(out_vcc,skb); - add_wait_queue(sk_atm(vcc)->sk_sleep, &wait); + add_wait_queue(sk_sleep(sk_atm(vcc)), &wait); while (test_bit(flag,&vcc->flags) == old_test) { mb(); out_vcc = PRIV(vcc->dev) ? PRIV(vcc->dev)->vcc : NULL; @@ -79,7 +80,7 @@ static int atmtcp_send_control(struct atm_vcc *vcc,int type, schedule(); } set_current_state(TASK_RUNNING); - remove_wait_queue(sk_atm(vcc)->sk_sleep, &wait); + remove_wait_queue(sk_sleep(sk_atm(vcc)), &wait); return error; } @@ -104,7 +105,7 @@ static int atmtcp_recv_control(const struct atmtcp_control *msg) msg->type); return -EINVAL; } - wake_up(sk_atm(vcc)->sk_sleep); + wake_up(sk_sleep(sk_atm(vcc))); return 0; } @@ -156,7 +157,6 @@ static int atmtcp_v_ioctl(struct atm_dev *dev,unsigned int cmd,void __user *arg) { struct atm_cirange ci; struct atm_vcc *vcc; - struct hlist_node *node; struct sock *s; int i; @@ -170,7 +170,7 @@ static int atmtcp_v_ioctl(struct atm_dev *dev,unsigned int cmd,void __user *arg) for(i = 0; i < VCC_HTABLE_SIZE; ++i) { struct hlist_head *head = &vcc_hash[i]; - sk_for_each(s, node, head) { + sk_for_each(s, head) { vcc = atm_sk(s); if (vcc->dev != dev) continue; @@ -263,12 +263,11 @@ static struct atm_vcc *find_vcc(struct atm_dev *dev, short vpi, int vci) { struct hlist_head *head; struct atm_vcc *vcc; - struct hlist_node *node; struct sock *s; head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)]; - sk_for_each(s, node, head) { + sk_for_each(s, head) { vcc = atm_sk(s); if (vcc->dev == dev && vcc->vci == vci && vcc->vpi == vpi && @@ -365,7 +364,7 @@ static int atmtcp_create(int itf,int persist,struct atm_dev **result) if (!dev_data) return -ENOMEM; - dev = atm_dev_register(DEV_LABEL,&atmtcp_v_dev_ops,itf,NULL); + dev = atm_dev_register(DEV_LABEL,NULL,&atmtcp_v_dev_ops,itf,NULL); if (!dev) { kfree(dev_data); return itf == -1 ? -ENOMEM : -EBUSY; @@ -391,7 +390,10 @@ static int atmtcp_attach(struct atm_vcc *vcc,int itf) atm_dev_put(dev); return -EMEDIUMTYPE; } - if (PRIV(dev)->vcc) return -EBUSY; + if (PRIV(dev)->vcc) { + atm_dev_put(dev); + return -EBUSY; + } } else { int error; diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c index 41b2204ebc6..b1955ba40d6 100644 --- a/drivers/atm/eni.c +++ b/drivers/atm/eni.c @@ -18,9 +18,9 @@ #include <linux/init.h> #include <linux/atm_eni.h> #include <linux/bitops.h> -#include <asm/system.h> +#include <linux/slab.h> #include <asm/io.h> -#include <asm/atomic.h> +#include <linux/atomic.h> #include <asm/uaccess.h> #include <asm/string.h> #include <asm/byteorder.h> @@ -155,9 +155,6 @@ static int tx_complete = 0,dma_complete = 0,queued = 0,requeued = 0, static struct atm_dev *eni_boards = NULL; -static u32 *cpu_zeroes = NULL; /* aligned "magic" zeroes */ -static dma_addr_t zeroes; - /* Read/write registers on card */ #define eni_in(r) readl(eni_dev->reg+(r)*4) #define eni_out(v,r) writel((v),eni_dev->reg+(r)*4) @@ -1130,14 +1127,17 @@ DPRINTK("doing direct send\n"); /* @@@ well, this doesn't work anyway */ if (i == -1) put_dma(tx->index,eni_dev->dma,&j,(unsigned long) skb->data, - skb->len - skb->data_len); + skb_headlen(skb)); else put_dma(tx->index,eni_dev->dma,&j,(unsigned long) - skb_shinfo(skb)->frags[i].page + skb_shinfo(skb)->frags[i].page_offset, - skb_shinfo(skb)->frags[i].size); + skb_frag_page(&skb_shinfo(skb)->frags[i]) + + skb_shinfo(skb)->frags[i].page_offset, + skb_frag_size(&skb_shinfo(skb)->frags[i])); + } + if (skb->len & 3) { + put_dma(tx->index, eni_dev->dma, &j, eni_dev->zero.dma, + 4 - (skb->len & 3)); } - if (skb->len & 3) - put_dma(tx->index,eni_dev->dma,&j,zeroes,4-(skb->len & 3)); /* JK for AAL5 trailer - AAL0 doesn't need it, but who cares ... */ eni_dev->dma[j++] = (((tx->tx_pos+size) & (tx->words-1)) << MID_DMA_COUNT_SHIFT) | (tx->index << MID_DMA_CHAN_SHIFT) | @@ -1270,7 +1270,7 @@ static int comp_tx(struct eni_dev *eni_dev,int *pcr,int reserved,int *pre, if (*pre < 3) (*pre)++; /* else fail later */ div = pre_div[*pre]*-*pcr; DPRINTK("max div %d\n",div); - *res = (TS_CLOCK+div-1)/div-1; + *res = DIV_ROUND_UP(TS_CLOCK, div)-1; } if (*res < 0) *res = 0; if (*res > MID_SEG_MAX_RATE) *res = MID_SEG_MAX_RATE; @@ -1468,10 +1468,7 @@ if (eni_boards) printk(KERN_INFO "loss: %ld\n",ENI_DEV(eni_boards)->lost); static void bug_int(struct atm_dev *dev,unsigned long reason) { - struct eni_dev *eni_dev; - DPRINTK(">bug_int\n"); - eni_dev = ENI_DEV(dev); if (reason & MID_DMA_ERR_ACK) printk(KERN_CRIT DEV_LABEL "(itf %d): driver error - DMA " "error\n",dev->number); @@ -1570,7 +1567,7 @@ tx_complete++; /*--------------------------------- entries ---------------------------------*/ -static const char *media_name[] __devinitdata = { +static char * const media_name[] = { "MMF", "SMF", "MMF", "03?", /* 0- 3 */ "UTP", "05?", "06?", "07?", /* 4- 7 */ "TAXI","09?", "10?", "11?", /* 8-11 */ @@ -1594,7 +1591,7 @@ static const char *media_name[] __devinitdata = { } }) -static int __devinit get_esi_asic(struct atm_dev *dev) +static int get_esi_asic(struct atm_dev *dev) { struct eni_dev *eni_dev; unsigned char tonga; @@ -1686,7 +1683,7 @@ static int __devinit get_esi_asic(struct atm_dev *dev) #undef GET_SEPROM -static int __devinit get_esi_fpga(struct atm_dev *dev, void __iomem *base) +static int get_esi_fpga(struct atm_dev *dev, void __iomem *base) { void __iomem *mac_base; int i; @@ -1697,7 +1694,7 @@ static int __devinit get_esi_fpga(struct atm_dev *dev, void __iomem *base) } -static int __devinit eni_do_init(struct atm_dev *dev) +static int eni_do_init(struct atm_dev *dev) { struct midway_eprom __iomem *eprom; struct eni_dev *eni_dev; @@ -1729,15 +1726,17 @@ static int __devinit eni_do_init(struct atm_dev *dev) "mapping\n",dev->number); return error; } + eni_dev->ioaddr = base; eni_dev->base_diff = real_base - (unsigned long) base; /* id may not be present in ASIC Tonga boards - check this @@@ */ if (!eni_dev->asic) { eprom = (base+EPROM_SIZE-sizeof(struct midway_eprom)); if (readl(&eprom->magic) != ENI155_MAGIC) { printk("\n"); - printk(KERN_ERR KERN_ERR DEV_LABEL "(itf %d): bad " - "magic - expected 0x%x, got 0x%x\n",dev->number, - ENI155_MAGIC,(unsigned) readl(&eprom->magic)); + printk(KERN_ERR DEV_LABEL + "(itf %d): bad magic - expected 0x%x, got 0x%x\n", + dev->number, ENI155_MAGIC, + (unsigned)readl(&eprom->magic)); error = -EINVAL; goto unmap; } @@ -1789,8 +1788,16 @@ unmap: goto out; } +static void eni_do_release(struct atm_dev *dev) +{ + struct eni_dev *ed = ENI_DEV(dev); + + dev->phy->stop(dev); + dev->phy = NULL; + iounmap(ed->ioaddr); +} -static int __devinit eni_start(struct atm_dev *dev) +static int eni_start(struct atm_dev *dev) { struct eni_dev *eni_dev; @@ -1873,7 +1880,7 @@ free_list: kfree(eni_dev->free_list); free_irq: - free_irq(eni_dev->irq, eni_dev); + free_irq(eni_dev->irq, dev); out: return error; @@ -1898,7 +1905,6 @@ static void eni_close(struct atm_vcc *vcc) static int eni_open(struct atm_vcc *vcc) { - struct eni_dev *eni_dev; struct eni_vcc *eni_vcc; int error; short vpi = vcc->vpi; @@ -1908,7 +1914,6 @@ static int eni_open(struct atm_vcc *vcc) EVENT("eni_open\n",0,0); if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) vcc->dev_data = NULL; - eni_dev = ENI_DEV(vcc->dev); if (vci != ATM_VPI_UNSPEC && vpi != ATM_VCI_UNSPEC) set_bit(ATM_VF_ADDR,&vcc->flags); if (vcc->qos.aal != ATM_AAL0 && vcc->qos.aal != ATM_AAL5) @@ -2031,7 +2036,7 @@ static int eni_getsockopt(struct atm_vcc *vcc,int level,int optname, static int eni_setsockopt(struct atm_vcc *vcc,int level,int optname, - void __user *optval,int optlen) + void __user *optval,unsigned int optlen) { return -EINVAL; } @@ -2088,7 +2093,6 @@ static unsigned char eni_phy_get(struct atm_dev *dev,unsigned long addr) static int eni_proc_read(struct atm_dev *dev,loff_t *pos,char *page) { - struct hlist_node *node; struct sock *s; static const char *signal[] = { "LOST","unknown","okay" }; struct eni_dev *eni_dev = ENI_DEV(dev); @@ -2166,7 +2170,7 @@ static int eni_proc_read(struct atm_dev *dev,loff_t *pos,char *page) for(i = 0; i < VCC_HTABLE_SIZE; ++i) { struct hlist_head *head = &vcc_hash[i]; - sk_for_each(s, node, head) { + sk_for_each(s, head) { struct eni_vcc *eni_vcc; int length; @@ -2221,65 +2225,83 @@ static const struct atmdev_ops ops = { }; -static int __devinit eni_init_one(struct pci_dev *pci_dev, - const struct pci_device_id *ent) +static int eni_init_one(struct pci_dev *pci_dev, + const struct pci_device_id *ent) { struct atm_dev *dev; struct eni_dev *eni_dev; - int error = -ENOMEM; + struct eni_zero *zero; + int rc; - DPRINTK("eni_init_one\n"); + rc = pci_enable_device(pci_dev); + if (rc < 0) + goto out; - if (pci_enable_device(pci_dev)) { - error = -EIO; - goto out0; - } + rc = -ENOMEM; + eni_dev = kmalloc(sizeof(struct eni_dev), GFP_KERNEL); + if (!eni_dev) + goto err_disable; - eni_dev = kmalloc(sizeof(struct eni_dev),GFP_KERNEL); - if (!eni_dev) goto out0; - if (!cpu_zeroes) { - cpu_zeroes = pci_alloc_consistent(pci_dev,ENI_ZEROES_SIZE, - &zeroes); - if (!cpu_zeroes) goto out1; - } - dev = atm_dev_register(DEV_LABEL,&ops,-1,NULL); - if (!dev) goto out2; + zero = &eni_dev->zero; + zero->addr = pci_alloc_consistent(pci_dev, ENI_ZEROES_SIZE, &zero->dma); + if (!zero->addr) + goto err_kfree; + + dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &ops, -1, NULL); + if (!dev) + goto err_free_consistent; + + dev->dev_data = eni_dev; pci_set_drvdata(pci_dev, dev); eni_dev->pci_dev = pci_dev; - dev->dev_data = eni_dev; eni_dev->asic = ent->driver_data; - error = eni_do_init(dev); - if (error) goto out3; - error = eni_start(dev); - if (error) goto out3; + + rc = eni_do_init(dev); + if (rc < 0) + goto err_unregister; + + rc = eni_start(dev); + if (rc < 0) + goto err_eni_release; + eni_dev->more = eni_boards; eni_boards = dev; - return 0; -out3: +out: + return rc; + +err_eni_release: + eni_do_release(dev); +err_unregister: atm_dev_deregister(dev); -out2: - pci_free_consistent(eni_dev->pci_dev,ENI_ZEROES_SIZE,cpu_zeroes,zeroes); - cpu_zeroes = NULL; -out1: +err_free_consistent: + pci_free_consistent(pci_dev, ENI_ZEROES_SIZE, zero->addr, zero->dma); +err_kfree: kfree(eni_dev); -out0: - return error; +err_disable: + pci_disable_device(pci_dev); + goto out; } static struct pci_device_id eni_pci_tbl[] = { - { PCI_VENDOR_ID_EF, PCI_DEVICE_ID_EF_ATM_FPGA, PCI_ANY_ID, PCI_ANY_ID, - 0, 0, 0 /* FPGA */ }, - { PCI_VENDOR_ID_EF, PCI_DEVICE_ID_EF_ATM_ASIC, PCI_ANY_ID, PCI_ANY_ID, - 0, 0, 1 /* ASIC */ }, + { PCI_VDEVICE(EF, PCI_DEVICE_ID_EF_ATM_FPGA), 0 /* FPGA */ }, + { PCI_VDEVICE(EF, PCI_DEVICE_ID_EF_ATM_ASIC), 1 /* ASIC */ }, { 0, } }; MODULE_DEVICE_TABLE(pci,eni_pci_tbl); -static void __devexit eni_remove_one(struct pci_dev *pci_dev) +static void eni_remove_one(struct pci_dev *pdev) { - /* grrr */ + struct atm_dev *dev = pci_get_drvdata(pdev); + struct eni_dev *ed = ENI_DEV(dev); + struct eni_zero *zero = &ed->zero; + + eni_do_release(dev); + atm_dev_deregister(dev); + pci_free_consistent(pdev, ENI_ZEROES_SIZE, zero->addr, zero->dma); + kfree(ed); + pci_disable_device(pdev); } @@ -2287,7 +2309,7 @@ static struct pci_driver eni_driver = { .name = DEV_LABEL, .id_table = eni_pci_tbl, .probe = eni_init_one, - .remove = __devexit_p(eni_remove_one), + .remove = eni_remove_one, }; diff --git a/drivers/atm/eni.h b/drivers/atm/eni.h index d04fefb0841..565e53a5cb7 100644 --- a/drivers/atm/eni.h +++ b/drivers/atm/eni.h @@ -8,17 +8,17 @@ #include <linux/atm.h> #include <linux/atmdev.h> +#include <linux/interrupt.h> #include <linux/sonet.h> #include <linux/skbuff.h> #include <linux/time.h> #include <linux/pci.h> #include <linux/spinlock.h> -#include <asm/atomic.h> +#include <linux/atomic.h> #include "midway.h" -#define KERNEL_OFFSET 0xC0000000 /* kernel 0x0 is at phys 0xC0000000 */ #define DEV_LABEL "eni" #define UBR_BUFFER (128*1024) /* UBR buffer size */ @@ -72,6 +72,7 @@ struct eni_dev { u32 events; /* pending events */ /*-------------------------------- base pointers into Midway address space */ + void __iomem *ioaddr; void __iomem *phy; /* PHY interface chip registers */ void __iomem *reg; /* register base */ void __iomem *ram; /* RAM base */ @@ -86,6 +87,10 @@ struct eni_dev { wait_queue_head_t tx_wait; /* for close */ int tx_bw; /* remaining bandwidth */ u32 dma[TX_DMA_BUF*2]; /* DMA request scratch area */ + struct eni_zero { /* aligned "magic" zeroes */ + u32 *addr; + dma_addr_t dma; + } zero; int tx_mult; /* buffer size multiplier (percent) */ /*-------------------------------- RX part */ u32 serv_read; /* host service read index */ diff --git a/drivers/atm/firestream.c b/drivers/atm/firestream.c index 98099f526d8..82f2ae0d7cc 100644 --- a/drivers/atm/firestream.c +++ b/drivers/atm/firestream.c @@ -44,13 +44,14 @@ #include <linux/ioport.h> /* for request_region */ #include <linux/uio.h> #include <linux/init.h> +#include <linux/interrupt.h> #include <linux/capability.h> #include <linux/bitops.h> +#include <linux/slab.h> #include <asm/byteorder.h> -#include <asm/system.h> #include <asm/string.h> #include <asm/io.h> -#include <asm/atomic.h> +#include <linux/atomic.h> #include <asm/uaccess.h> #include <linux/wait.h> @@ -251,7 +252,7 @@ struct reginit_item { }; -static struct reginit_item PHY_NTC_INIT[] __devinitdata = { +static struct reginit_item PHY_NTC_INIT[] = { { PHY_CLEARALL, 0x40 }, { 0x12, 0x0001 }, { 0x13, 0x7605 }, @@ -443,8 +444,8 @@ static inline void fs_kfree_skb (struct sk_buff * skb) #define ROUND_NEAREST 3 /********** make rate (not quite as much fun as Horizon) **********/ -static unsigned int make_rate (unsigned int rate, int r, - u16 * bits, unsigned int * actual) +static int make_rate(unsigned int rate, int r, + u16 *bits, unsigned int *actual) { unsigned char exp = -1; /* hush gcc */ unsigned int man = -1; /* hush gcc */ @@ -735,8 +736,8 @@ static void process_txdone_queue (struct fs_dev *dev, struct queue *q) skb = td->skb; if (skb == FS_VCC (ATM_SKB(skb)->vcc)->last_skb) { - wake_up_interruptible (& FS_VCC (ATM_SKB(skb)->vcc)->close_wait); FS_VCC (ATM_SKB(skb)->vcc)->last_skb = NULL; + wake_up_interruptible (& FS_VCC (ATM_SKB(skb)->vcc)->close_wait); } td->dev->ntxpckts--; @@ -1030,7 +1031,7 @@ static int fs_open(struct atm_vcc *atm_vcc) /* We now use the "submit_command" function to submit commands to the firestream. There is a define up near the definition of that routine that switches this routine between immediate write - to the immediate comamnd registers and queuing the commands in + to the immediate command registers and queuing the commands in the HPTXQ for execution. This last technique might be more efficient if we know we're going to submit a whole lot of commands in one go, but this driver is not setup to be able to @@ -1122,7 +1123,7 @@ static void fs_close(struct atm_vcc *atm_vcc) this sleep_on, we'll lose any reference to these packets. Memory leak! On the other hand, it's awfully convenient that we can abort a "close" that is taking too long. Maybe just use non-interruptible sleep on? -- REW */ - interruptible_sleep_on (& vcc->close_wait); + wait_event_interruptible(vcc->close_wait, !vcc->last_skb); } txtp = &atm_vcc->qos.txtp; @@ -1244,7 +1245,7 @@ static int fs_getsockopt(struct atm_vcc *vcc,int level,int optname, static int fs_setsockopt(struct atm_vcc *vcc,int level,int optname, - void __user *optval,int optlen) + void __user *optval,unsigned int optlen) { func_enter (); func_exit (); @@ -1294,7 +1295,7 @@ static const struct atmdev_ops ops = { }; -static void __devinit undocumented_pci_fix (struct pci_dev *pdev) +static void undocumented_pci_fix(struct pci_dev *pdev) { u32 tint; @@ -1318,13 +1319,13 @@ static void __devinit undocumented_pci_fix (struct pci_dev *pdev) * PHY routines * **************************************************************************/ -static void __devinit write_phy (struct fs_dev *dev, int regnum, int val) +static void write_phy(struct fs_dev *dev, int regnum, int val) { submit_command (dev, &dev->hp_txq, QE_CMD_PRP_WR | QE_CMD_IMM_INQ, regnum, val, 0); } -static int __devinit init_phy (struct fs_dev *dev, struct reginit_item *reginit) +static int init_phy(struct fs_dev *dev, struct reginit_item *reginit) { int i; @@ -1380,7 +1381,7 @@ static void reset_chip (struct fs_dev *dev) } } -static void __devinit *aligned_kmalloc (int size, gfp_t flags, int alignment) +static void *aligned_kmalloc(int size, gfp_t flags, int alignment) { void *t; @@ -1397,8 +1398,8 @@ static void __devinit *aligned_kmalloc (int size, gfp_t flags, int alignment) return NULL; } -static int __devinit init_q (struct fs_dev *dev, - struct queue *txq, int queue, int nentries, int is_rq) +static int init_q(struct fs_dev *dev, struct queue *txq, int queue, + int nentries, int is_rq) { int sz = nentries * sizeof (struct FS_QENTRY); struct FS_QENTRY *p; @@ -1433,8 +1434,8 @@ static int __devinit init_q (struct fs_dev *dev, } -static int __devinit init_fp (struct fs_dev *dev, - struct freepool *fp, int queue, int bufsize, int nr_buffers) +static int init_fp(struct fs_dev *dev, struct freepool *fp, int queue, + int bufsize, int nr_buffers) { func_enter (); @@ -1527,7 +1528,7 @@ static void top_off_fp (struct fs_dev *dev, struct freepool *fp, fs_dprintk (FS_DEBUG_QUEUE, "Added %d entries. \n", n); } -static void __devexit free_queue (struct fs_dev *dev, struct queue *txq) +static void free_queue(struct fs_dev *dev, struct queue *txq) { func_enter (); @@ -1543,7 +1544,7 @@ static void __devexit free_queue (struct fs_dev *dev, struct queue *txq) func_exit (); } -static void __devexit free_freepool (struct fs_dev *dev, struct freepool *fp) +static void free_freepool(struct fs_dev *dev, struct freepool *fp) { func_enter (); @@ -1661,7 +1662,7 @@ static void fs_poll (unsigned long data) } #endif -static int __devinit fs_init (struct fs_dev *dev) +static int fs_init(struct fs_dev *dev) { struct pci_dev *pci_dev; int isr, to; @@ -1690,17 +1691,17 @@ static int __devinit fs_init (struct fs_dev *dev) | (0 * SARMODE0_SHADEN) /* We don't use shadow registers. */ | (1 * SARMODE0_INTMODE_READCLEAR) | (1 * SARMODE0_CWRE) - | IS_FS50(dev)?SARMODE0_PRPWT_FS50_5: - SARMODE0_PRPWT_FS155_3 + | (IS_FS50(dev) ? SARMODE0_PRPWT_FS50_5: + SARMODE0_PRPWT_FS155_3) | (1 * SARMODE0_CALSUP_1) - | IS_FS50 (dev)?(0 + | (IS_FS50(dev) ? (0 | SARMODE0_RXVCS_32 | SARMODE0_ABRVCS_32 | SARMODE0_TXVCS_32): (0 | SARMODE0_RXVCS_1k | SARMODE0_ABRVCS_1k - | SARMODE0_TXVCS_1k)); + | SARMODE0_TXVCS_1k))); /* 10ms * 100 is 1 second. That should be enough, as AN3:9 says it takes 1ms. */ @@ -1781,7 +1782,7 @@ static int __devinit fs_init (struct fs_dev *dev) write_fs (dev, RAS0, RAS0_DCD_XHLT | (((1 << FS155_VPI_BITS) - 1) * RAS0_VPSEL) | (((1 << FS155_VCI_BITS) - 1) * RAS0_VCSEL)); - /* We can chose the split arbitarily. We might be able to + /* We can chose the split arbitrarily. We might be able to support more. Whatever. This should do for now. */ dev->atm_dev->ci_range.vpi_bits = FS155_VPI_BITS; dev->atm_dev->ci_range.vci_bits = FS155_VCI_BITS; @@ -1896,8 +1897,8 @@ unmap: return 1; } -static int __devinit firestream_init_one (struct pci_dev *pci_dev, - const struct pci_device_id *ent) +static int firestream_init_one(struct pci_dev *pci_dev, + const struct pci_device_id *ent) { struct atm_dev *atm_dev; struct fs_dev *fs_dev; @@ -1910,7 +1911,7 @@ static int __devinit firestream_init_one (struct pci_dev *pci_dev, fs_dev, sizeof (struct fs_dev)); if (!fs_dev) goto err_out; - atm_dev = atm_dev_register("fs", &ops, -1, NULL); + atm_dev = atm_dev_register("fs", &pci_dev->dev, &ops, -1, NULL); if (!atm_dev) goto err_out_free_fs_dev; @@ -1933,7 +1934,7 @@ static int __devinit firestream_init_one (struct pci_dev *pci_dev, return -ENODEV; } -static void __devexit firestream_remove_one (struct pci_dev *pdev) +static void firestream_remove_one(struct pci_dev *pdev) { int i; struct fs_dev *dev, *nxtdev; @@ -1999,7 +2000,7 @@ static void __devexit firestream_remove_one (struct pci_dev *pdev) fs_dprintk (FS_DEBUG_CLEANUP, "Freeing irq%d.\n", dev->irq); free_irq (dev->irq, dev); - del_timer (&dev->timer); + del_timer_sync (&dev->timer); atm_dev_deregister(dev->atm_dev); free_queue (dev, &dev->hp_txq); @@ -2026,10 +2027,8 @@ static void __devexit firestream_remove_one (struct pci_dev *pdev) } static struct pci_device_id firestream_pci_tbl[] = { - { PCI_VENDOR_ID_FUJITSU_ME, PCI_DEVICE_ID_FUJITSU_FS50, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, FS_IS50}, - { PCI_VENDOR_ID_FUJITSU_ME, PCI_DEVICE_ID_FUJITSU_FS155, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, FS_IS155}, + { PCI_VDEVICE(FUJITSU_ME, PCI_DEVICE_ID_FUJITSU_FS50), FS_IS50}, + { PCI_VDEVICE(FUJITSU_ME, PCI_DEVICE_ID_FUJITSU_FS155), FS_IS155}, { 0, } }; @@ -2039,7 +2038,7 @@ static struct pci_driver firestream_driver = { .name = "firestream", .id_table = firestream_pci_tbl, .probe = firestream_init_one, - .remove = __devexit_p(firestream_remove_one), + .remove = firestream_remove_one, }; static int __init firestream_init_module (void) diff --git a/drivers/atm/firestream.h b/drivers/atm/firestream.h index 49e783e35ee..364eded3188 100644 --- a/drivers/atm/firestream.h +++ b/drivers/atm/firestream.h @@ -420,7 +420,6 @@ struct fs_transmit_config { #define RC_FLAGS_BFPS_BFP27 (0xd << 17) #define RC_FLAGS_BFPS_BFP47 (0xe << 17) -#define RC_FLAGS_BFPS (0x1 << 17) #define RC_FLAGS_BFPP (0x1 << 21) #define RC_FLAGS_TEVC (0x1 << 22) #define RC_FLAGS_TEP (0x1 << 23) diff --git a/drivers/atm/fore200e.c b/drivers/atm/fore200e.c index 432181ed7bb..d4725fc0395 100644 --- a/drivers/atm/fore200e.c +++ b/drivers/atm/fore200e.c @@ -36,6 +36,7 @@ #include <linux/atm_suni.h> #include <linux/dma-mapping.h> #include <linux/delay.h> +#include <linux/firmware.h> #include <asm/io.h> #include <asm/string.h> #include <asm/page.h> @@ -43,11 +44,12 @@ #include <asm/dma.h> #include <asm/byteorder.h> #include <asm/uaccess.h> -#include <asm/atomic.h> +#include <linux/atomic.h> -#ifdef CONFIG_ATM_FORE200E_SBA +#ifdef CONFIG_SBUS +#include <linux/of.h> +#include <linux/of_device.h> #include <asm/idprom.h> -#include <asm/sbus.h> #include <asm/openprom.h> #include <asm/oplib.h> #include <asm/pgtable.h> @@ -90,7 +92,7 @@ #define FORE200E_INDEX(virt_addr, type, index) (&((type *)(virt_addr))[ index ]) -#define FORE200E_NEXT_ENTRY(index, modulo) (index = ++(index) % (modulo)) +#define FORE200E_NEXT_ENTRY(index, modulo) (index = ((index) + 1) % (modulo)) #if 1 #define ASSERT(expr) if (!(expr)) { \ @@ -382,9 +384,6 @@ fore200e_shutdown(struct fore200e* fore200e) case FORE200E_STATE_START_FW: /* nothing to do for that state */ - case FORE200E_STATE_LOAD_FW: - /* nothing to do for that state */ - case FORE200E_STATE_RESET: /* nothing to do for that state */ @@ -405,7 +404,7 @@ fore200e_shutdown(struct fore200e* fore200e) } -#ifdef CONFIG_ATM_FORE200E_PCA +#ifdef CONFIG_PCI static u32 fore200e_pca_read(volatile u32 __iomem *addr) { @@ -528,8 +527,7 @@ fore200e_pca_reset(struct fore200e* fore200e) } -static int __devinit -fore200e_pca_map(struct fore200e* fore200e) +static int fore200e_pca_map(struct fore200e* fore200e) { DPRINTK(2, "device %s being mapped in memory\n", fore200e->name); @@ -562,8 +560,7 @@ fore200e_pca_unmap(struct fore200e* fore200e) } -static int __devinit -fore200e_pca_configure(struct fore200e* fore200e) +static int fore200e_pca_configure(struct fore200e *fore200e) { struct pci_dev* pci_dev = (struct pci_dev*)fore200e->bus_dev; u8 master_ctrl, latency; @@ -658,256 +655,198 @@ fore200e_pca_proc_read(struct fore200e* fore200e, char *page) pci_dev->bus->number, PCI_SLOT(pci_dev->devfn), PCI_FUNC(pci_dev->devfn)); } -#endif /* CONFIG_ATM_FORE200E_PCA */ +#endif /* CONFIG_PCI */ -#ifdef CONFIG_ATM_FORE200E_SBA +#ifdef CONFIG_SBUS -static u32 -fore200e_sba_read(volatile u32 __iomem *addr) +static u32 fore200e_sba_read(volatile u32 __iomem *addr) { return sbus_readl(addr); } - -static void -fore200e_sba_write(u32 val, volatile u32 __iomem *addr) +static void fore200e_sba_write(u32 val, volatile u32 __iomem *addr) { sbus_writel(val, addr); } - -static u32 -fore200e_sba_dma_map(struct fore200e* fore200e, void* virt_addr, int size, int direction) +static u32 fore200e_sba_dma_map(struct fore200e *fore200e, void* virt_addr, int size, int direction) { - u32 dma_addr = sbus_map_single((struct sbus_dev*)fore200e->bus_dev, virt_addr, size, direction); + struct platform_device *op = fore200e->bus_dev; + u32 dma_addr; - DPRINTK(3, "SBUS DVMA mapping: virt_addr = 0x%p, size = %d, direction = %d --> dma_addr = 0x%08x\n", - virt_addr, size, direction, dma_addr); + dma_addr = dma_map_single(&op->dev, virt_addr, size, direction); + + DPRINTK(3, "SBUS DVMA mapping: virt_addr = 0x%p, size = %d, direction = %d --> dma_addr = 0x%08x\n", + virt_addr, size, direction, dma_addr); - return dma_addr; + return dma_addr; } - -static void -fore200e_sba_dma_unmap(struct fore200e* fore200e, u32 dma_addr, int size, int direction) +static void fore200e_sba_dma_unmap(struct fore200e *fore200e, u32 dma_addr, int size, int direction) { - DPRINTK(3, "SBUS DVMA unmapping: dma_addr = 0x%08x, size = %d, direction = %d,\n", - dma_addr, size, direction); + struct platform_device *op = fore200e->bus_dev; - sbus_unmap_single((struct sbus_dev*)fore200e->bus_dev, dma_addr, size, direction); -} + DPRINTK(3, "SBUS DVMA unmapping: dma_addr = 0x%08x, size = %d, direction = %d,\n", + dma_addr, size, direction); + dma_unmap_single(&op->dev, dma_addr, size, direction); +} -static void -fore200e_sba_dma_sync_for_cpu(struct fore200e* fore200e, u32 dma_addr, int size, int direction) +static void fore200e_sba_dma_sync_for_cpu(struct fore200e *fore200e, u32 dma_addr, int size, int direction) { - DPRINTK(3, "SBUS DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction); + struct platform_device *op = fore200e->bus_dev; + + DPRINTK(3, "SBUS DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction); - sbus_dma_sync_single_for_cpu((struct sbus_dev*)fore200e->bus_dev, dma_addr, size, direction); + dma_sync_single_for_cpu(&op->dev, dma_addr, size, direction); } -static void -fore200e_sba_dma_sync_for_device(struct fore200e* fore200e, u32 dma_addr, int size, int direction) +static void fore200e_sba_dma_sync_for_device(struct fore200e *fore200e, u32 dma_addr, int size, int direction) { - DPRINTK(3, "SBUS DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction); - - sbus_dma_sync_single_for_device((struct sbus_dev*)fore200e->bus_dev, dma_addr, size, direction); -} + struct platform_device *op = fore200e->bus_dev; + DPRINTK(3, "SBUS DVMA sync: dma_addr = 0x%08x, size = %d, direction = %d\n", dma_addr, size, direction); -/* allocate a DVMA consistent chunk of memory intended to act as a communication mechanism - (to hold descriptors, status, queues, etc.) shared by the driver and the adapter */ + dma_sync_single_for_device(&op->dev, dma_addr, size, direction); +} -static int -fore200e_sba_dma_chunk_alloc(struct fore200e* fore200e, struct chunk* chunk, - int size, int nbr, int alignment) +/* Allocate a DVMA consistent chunk of memory intended to act as a communication mechanism + * (to hold descriptors, status, queues, etc.) shared by the driver and the adapter. + */ +static int fore200e_sba_dma_chunk_alloc(struct fore200e *fore200e, struct chunk *chunk, + int size, int nbr, int alignment) { - chunk->alloc_size = chunk->align_size = size * nbr; + struct platform_device *op = fore200e->bus_dev; - /* returned chunks are page-aligned */ - chunk->alloc_addr = sbus_alloc_consistent((struct sbus_dev*)fore200e->bus_dev, - chunk->alloc_size, - &chunk->dma_addr); + chunk->alloc_size = chunk->align_size = size * nbr; - if ((chunk->alloc_addr == NULL) || (chunk->dma_addr == 0)) - return -ENOMEM; + /* returned chunks are page-aligned */ + chunk->alloc_addr = dma_alloc_coherent(&op->dev, chunk->alloc_size, + &chunk->dma_addr, GFP_ATOMIC); - chunk->align_addr = chunk->alloc_addr; + if ((chunk->alloc_addr == NULL) || (chunk->dma_addr == 0)) + return -ENOMEM; + + chunk->align_addr = chunk->alloc_addr; - return 0; + return 0; } - /* free a DVMA consistent chunk of memory */ - -static void -fore200e_sba_dma_chunk_free(struct fore200e* fore200e, struct chunk* chunk) +static void fore200e_sba_dma_chunk_free(struct fore200e *fore200e, struct chunk *chunk) { - sbus_free_consistent((struct sbus_dev*)fore200e->bus_dev, - chunk->alloc_size, - chunk->alloc_addr, - chunk->dma_addr); -} + struct platform_device *op = fore200e->bus_dev; + dma_free_coherent(&op->dev, chunk->alloc_size, + chunk->alloc_addr, chunk->dma_addr); +} -static void -fore200e_sba_irq_enable(struct fore200e* fore200e) +static void fore200e_sba_irq_enable(struct fore200e *fore200e) { - u32 hcr = fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_STICKY; - fore200e->bus->write(hcr | SBA200E_HCR_INTR_ENA, fore200e->regs.sba.hcr); + u32 hcr = fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_STICKY; + fore200e->bus->write(hcr | SBA200E_HCR_INTR_ENA, fore200e->regs.sba.hcr); } - -static int -fore200e_sba_irq_check(struct fore200e* fore200e) +static int fore200e_sba_irq_check(struct fore200e *fore200e) { - return fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_INTR_REQ; + return fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_INTR_REQ; } - -static void -fore200e_sba_irq_ack(struct fore200e* fore200e) +static void fore200e_sba_irq_ack(struct fore200e *fore200e) { - u32 hcr = fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_STICKY; - fore200e->bus->write(hcr | SBA200E_HCR_INTR_CLR, fore200e->regs.sba.hcr); + u32 hcr = fore200e->bus->read(fore200e->regs.sba.hcr) & SBA200E_HCR_STICKY; + fore200e->bus->write(hcr | SBA200E_HCR_INTR_CLR, fore200e->regs.sba.hcr); } - -static void -fore200e_sba_reset(struct fore200e* fore200e) +static void fore200e_sba_reset(struct fore200e *fore200e) { - fore200e->bus->write(SBA200E_HCR_RESET, fore200e->regs.sba.hcr); - fore200e_spin(10); - fore200e->bus->write(0, fore200e->regs.sba.hcr); + fore200e->bus->write(SBA200E_HCR_RESET, fore200e->regs.sba.hcr); + fore200e_spin(10); + fore200e->bus->write(0, fore200e->regs.sba.hcr); } - -static int __init -fore200e_sba_map(struct fore200e* fore200e) +static int __init fore200e_sba_map(struct fore200e *fore200e) { - struct sbus_dev* sbus_dev = (struct sbus_dev*)fore200e->bus_dev; - unsigned int bursts; + struct platform_device *op = fore200e->bus_dev; + unsigned int bursts; - /* gain access to the SBA specific registers */ - fore200e->regs.sba.hcr = sbus_ioremap(&sbus_dev->resource[0], 0, SBA200E_HCR_LENGTH, "SBA HCR"); - fore200e->regs.sba.bsr = sbus_ioremap(&sbus_dev->resource[1], 0, SBA200E_BSR_LENGTH, "SBA BSR"); - fore200e->regs.sba.isr = sbus_ioremap(&sbus_dev->resource[2], 0, SBA200E_ISR_LENGTH, "SBA ISR"); - fore200e->virt_base = sbus_ioremap(&sbus_dev->resource[3], 0, SBA200E_RAM_LENGTH, "SBA RAM"); + /* gain access to the SBA specific registers */ + fore200e->regs.sba.hcr = of_ioremap(&op->resource[0], 0, SBA200E_HCR_LENGTH, "SBA HCR"); + fore200e->regs.sba.bsr = of_ioremap(&op->resource[1], 0, SBA200E_BSR_LENGTH, "SBA BSR"); + fore200e->regs.sba.isr = of_ioremap(&op->resource[2], 0, SBA200E_ISR_LENGTH, "SBA ISR"); + fore200e->virt_base = of_ioremap(&op->resource[3], 0, SBA200E_RAM_LENGTH, "SBA RAM"); - if (fore200e->virt_base == NULL) { - printk(FORE200E "unable to map RAM of device %s\n", fore200e->name); - return -EFAULT; - } + if (!fore200e->virt_base) { + printk(FORE200E "unable to map RAM of device %s\n", fore200e->name); + return -EFAULT; + } - DPRINTK(1, "device %s mapped to 0x%p\n", fore200e->name, fore200e->virt_base); + DPRINTK(1, "device %s mapped to 0x%p\n", fore200e->name, fore200e->virt_base); - fore200e->bus->write(0x02, fore200e->regs.sba.isr); /* XXX hardwired interrupt level */ + fore200e->bus->write(0x02, fore200e->regs.sba.isr); /* XXX hardwired interrupt level */ - /* get the supported DVMA burst sizes */ - bursts = prom_getintdefault(sbus_dev->bus->prom_node, "burst-sizes", 0x00); + /* get the supported DVMA burst sizes */ + bursts = of_getintprop_default(op->dev.of_node->parent, "burst-sizes", 0x00); - if (sbus_can_dma_64bit(sbus_dev)) - sbus_set_sbus64(sbus_dev, bursts); + if (sbus_can_dma_64bit()) + sbus_set_sbus64(&op->dev, bursts); - fore200e->state = FORE200E_STATE_MAP; - return 0; + fore200e->state = FORE200E_STATE_MAP; + return 0; } - -static void -fore200e_sba_unmap(struct fore200e* fore200e) +static void fore200e_sba_unmap(struct fore200e *fore200e) { - sbus_iounmap(fore200e->regs.sba.hcr, SBA200E_HCR_LENGTH); - sbus_iounmap(fore200e->regs.sba.bsr, SBA200E_BSR_LENGTH); - sbus_iounmap(fore200e->regs.sba.isr, SBA200E_ISR_LENGTH); - sbus_iounmap(fore200e->virt_base, SBA200E_RAM_LENGTH); -} + struct platform_device *op = fore200e->bus_dev; + of_iounmap(&op->resource[0], fore200e->regs.sba.hcr, SBA200E_HCR_LENGTH); + of_iounmap(&op->resource[1], fore200e->regs.sba.bsr, SBA200E_BSR_LENGTH); + of_iounmap(&op->resource[2], fore200e->regs.sba.isr, SBA200E_ISR_LENGTH); + of_iounmap(&op->resource[3], fore200e->virt_base, SBA200E_RAM_LENGTH); +} -static int __init -fore200e_sba_configure(struct fore200e* fore200e) +static int __init fore200e_sba_configure(struct fore200e *fore200e) { - fore200e->state = FORE200E_STATE_CONFIGURE; - return 0; + fore200e->state = FORE200E_STATE_CONFIGURE; + return 0; } - -static struct fore200e* __init -fore200e_sba_detect(const struct fore200e_bus* bus, int index) +static int __init fore200e_sba_prom_read(struct fore200e *fore200e, struct prom_data *prom) { - struct fore200e* fore200e; - struct sbus_bus* sbus_bus; - struct sbus_dev* sbus_dev = NULL; - - unsigned int count = 0; - - for_each_sbus (sbus_bus) { - for_each_sbusdev (sbus_dev, sbus_bus) { - if (strcmp(sbus_dev->prom_name, SBA200E_PROM_NAME) == 0) { - if (count >= index) - goto found; - count++; - } - } - } - return NULL; - - found: - if (sbus_dev->num_registers != 4) { - printk(FORE200E "this %s device has %d instead of 4 registers\n", - bus->model_name, sbus_dev->num_registers); - return NULL; - } - - fore200e = kzalloc(sizeof(struct fore200e), GFP_KERNEL); - if (fore200e == NULL) - return NULL; + struct platform_device *op = fore200e->bus_dev; + const u8 *prop; + int len; - fore200e->bus = bus; - fore200e->bus_dev = sbus_dev; - fore200e->irq = sbus_dev->irqs[ 0 ]; + prop = of_get_property(op->dev.of_node, "madaddrlo2", &len); + if (!prop) + return -ENODEV; + memcpy(&prom->mac_addr[4], prop, 4); - fore200e->phys_base = (unsigned long)sbus_dev; + prop = of_get_property(op->dev.of_node, "madaddrhi4", &len); + if (!prop) + return -ENODEV; + memcpy(&prom->mac_addr[2], prop, 4); - sprintf(fore200e->name, "%s-%d", bus->model_name, index - 1); + prom->serial_number = of_getintprop_default(op->dev.of_node, + "serialnumber", 0); + prom->hw_revision = of_getintprop_default(op->dev.of_node, + "promversion", 0); - return fore200e; + return 0; } - -static int __init -fore200e_sba_prom_read(struct fore200e* fore200e, struct prom_data* prom) +static int fore200e_sba_proc_read(struct fore200e *fore200e, char *page) { - struct sbus_dev* sbus_dev = (struct sbus_dev*) fore200e->bus_dev; - int len; + struct platform_device *op = fore200e->bus_dev; + const struct linux_prom_registers *regs; - len = prom_getproperty(sbus_dev->prom_node, "macaddrlo2", &prom->mac_addr[ 4 ], 4); - if (len < 0) - return -EBUSY; + regs = of_get_property(op->dev.of_node, "reg", NULL); - len = prom_getproperty(sbus_dev->prom_node, "macaddrhi4", &prom->mac_addr[ 2 ], 4); - if (len < 0) - return -EBUSY; - - prom_getproperty(sbus_dev->prom_node, "serialnumber", - (char*)&prom->serial_number, sizeof(prom->serial_number)); - - prom_getproperty(sbus_dev->prom_node, "promversion", - (char*)&prom->hw_revision, sizeof(prom->hw_revision)); - - return 0; + return sprintf(page, " SBUS slot/device:\t\t%d/'%s'\n", + (regs ? regs->which_io : 0), op->dev.of_node->name); } - - -static int -fore200e_sba_proc_read(struct fore200e* fore200e, char *page) -{ - struct sbus_dev* sbus_dev = (struct sbus_dev*)fore200e->bus_dev; - - return sprintf(page, " SBUS slot/device:\t\t%d/'%s'\n", sbus_dev->slot, sbus_dev->prom_name); -} -#endif /* CONFIG_ATM_FORE200E_SBA */ +#endif /* CONFIG_SBUS */ static void @@ -1856,7 +1795,7 @@ fore200e_getsockopt(struct atm_vcc* vcc, int level, int optname, void __user *op static int -fore200e_setsockopt(struct atm_vcc* vcc, int level, int optname, void __user *optval, int optlen) +fore200e_setsockopt(struct atm_vcc* vcc, int level, int optname, void __user *optval, unsigned int optlen) { /* struct fore200e* fore200e = FORE200E_DEV(vcc->dev); */ @@ -2087,8 +2026,7 @@ fore200e_change_qos(struct atm_vcc* vcc,struct atm_qos* qos, int flags) } -static int __devinit -fore200e_irq_request(struct fore200e* fore200e) +static int fore200e_irq_request(struct fore200e *fore200e) { if (request_irq(fore200e->irq, fore200e_interrupt, IRQF_SHARED, fore200e->name, fore200e->atm_dev) < 0) { @@ -2110,8 +2048,7 @@ fore200e_irq_request(struct fore200e* fore200e) } -static int __devinit -fore200e_get_esi(struct fore200e* fore200e) +static int fore200e_get_esi(struct fore200e *fore200e) { struct prom_data* prom = kzalloc(sizeof(struct prom_data), GFP_KERNEL | GFP_DMA); int ok, i; @@ -2125,12 +2062,10 @@ fore200e_get_esi(struct fore200e* fore200e) return -EBUSY; } - printk(FORE200E "device %s, rev. %c, S/N: %d, ESI: %02x:%02x:%02x:%02x:%02x:%02x\n", + printk(FORE200E "device %s, rev. %c, S/N: %d, ESI: %pM\n", fore200e->name, (prom->hw_revision & 0xFF) + '@', /* probably meaningless with SBA boards */ - prom->serial_number & 0xFFFF, - prom->mac_addr[ 2 ], prom->mac_addr[ 3 ], prom->mac_addr[ 4 ], - prom->mac_addr[ 5 ], prom->mac_addr[ 6 ], prom->mac_addr[ 7 ]); + prom->serial_number & 0xFFFF, &prom->mac_addr[2]); for (i = 0; i < ESI_LEN; i++) { fore200e->esi[ i ] = fore200e->atm_dev->esi[ i ] = prom->mac_addr[ i + 2 ]; @@ -2142,8 +2077,7 @@ fore200e_get_esi(struct fore200e* fore200e) } -static int __devinit -fore200e_alloc_rx_buf(struct fore200e* fore200e) +static int fore200e_alloc_rx_buf(struct fore200e *fore200e) { int scheme, magn, nbr, size, i; @@ -2207,8 +2141,7 @@ fore200e_alloc_rx_buf(struct fore200e* fore200e) } -static int __devinit -fore200e_init_bs_queue(struct fore200e* fore200e) +static int fore200e_init_bs_queue(struct fore200e *fore200e) { int scheme, magn, i; @@ -2270,8 +2203,7 @@ fore200e_init_bs_queue(struct fore200e* fore200e) } -static int __devinit -fore200e_init_rx_queue(struct fore200e* fore200e) +static int fore200e_init_rx_queue(struct fore200e *fore200e) { struct host_rxq* rxq = &fore200e->host_rxq; struct cp_rxq_entry __iomem * cp_entry; @@ -2330,8 +2262,7 @@ fore200e_init_rx_queue(struct fore200e* fore200e) } -static int __devinit -fore200e_init_tx_queue(struct fore200e* fore200e) +static int fore200e_init_tx_queue(struct fore200e *fore200e) { struct host_txq* txq = &fore200e->host_txq; struct cp_txq_entry __iomem * cp_entry; @@ -2393,8 +2324,7 @@ fore200e_init_tx_queue(struct fore200e* fore200e) } -static int __devinit -fore200e_init_cmd_queue(struct fore200e* fore200e) +static int fore200e_init_cmd_queue(struct fore200e *fore200e) { struct host_cmdq* cmdq = &fore200e->host_cmdq; struct cp_cmdq_entry __iomem * cp_entry; @@ -2435,10 +2365,10 @@ fore200e_init_cmd_queue(struct fore200e* fore200e) } -static void __devinit -fore200e_param_bs_queue(struct fore200e* fore200e, - enum buffer_scheme scheme, enum buffer_magn magn, - int queue_length, int pool_size, int supply_blksize) +static void fore200e_param_bs_queue(struct fore200e *fore200e, + enum buffer_scheme scheme, + enum buffer_magn magn, int queue_length, + int pool_size, int supply_blksize) { struct bs_spec __iomem * bs_spec = &fore200e->cp_queues->init.bs_spec[ scheme ][ magn ]; @@ -2449,8 +2379,7 @@ fore200e_param_bs_queue(struct fore200e* fore200e, } -static int __devinit -fore200e_initialize(struct fore200e* fore200e) +static int fore200e_initialize(struct fore200e *fore200e) { struct cp_queues __iomem * cpq; int ok, scheme, magn; @@ -2501,8 +2430,7 @@ fore200e_initialize(struct fore200e* fore200e) } -static void __devinit -fore200e_monitor_putc(struct fore200e* fore200e, char c) +static void fore200e_monitor_putc(struct fore200e *fore200e, char c) { struct cp_monitor __iomem * monitor = fore200e->cp_monitor; @@ -2513,8 +2441,7 @@ fore200e_monitor_putc(struct fore200e* fore200e, char c) } -static int __devinit -fore200e_monitor_getc(struct fore200e* fore200e) +static int fore200e_monitor_getc(struct fore200e *fore200e) { struct cp_monitor __iomem * monitor = fore200e->cp_monitor; unsigned long timeout = jiffies + msecs_to_jiffies(50); @@ -2538,8 +2465,7 @@ fore200e_monitor_getc(struct fore200e* fore200e) } -static void __devinit -fore200e_monitor_puts(struct fore200e* fore200e, char* str) +static void fore200e_monitor_puts(struct fore200e *fore200e, char *str) { while (*str) { @@ -2552,13 +2478,53 @@ fore200e_monitor_puts(struct fore200e* fore200e, char* str) while (fore200e_monitor_getc(fore200e) >= 0); } +#ifdef __LITTLE_ENDIAN +#define FW_EXT ".bin" +#else +#define FW_EXT "_ecd.bin2" +#endif -static int __devinit -fore200e_start_fw(struct fore200e* fore200e) -{ - int ok; - char cmd[ 48 ]; - struct fw_header* fw_header = (struct fw_header*) fore200e->bus->fw_data; +static int fore200e_load_and_start_fw(struct fore200e *fore200e) +{ + const struct firmware *firmware; + struct device *device; + struct fw_header *fw_header; + const __le32 *fw_data; + u32 fw_size; + u32 __iomem *load_addr; + char buf[48]; + int err = -ENODEV; + + if (strcmp(fore200e->bus->model_name, "PCA-200E") == 0) + device = &((struct pci_dev *) fore200e->bus_dev)->dev; +#ifdef CONFIG_SBUS + else if (strcmp(fore200e->bus->model_name, "SBA-200E") == 0) + device = &((struct platform_device *) fore200e->bus_dev)->dev; +#endif + else + return err; + + sprintf(buf, "%s%s", fore200e->bus->proc_name, FW_EXT); + if ((err = request_firmware(&firmware, buf, device)) < 0) { + printk(FORE200E "problem loading firmware image %s\n", fore200e->bus->model_name); + return err; + } + + fw_data = (__le32 *) firmware->data; + fw_size = firmware->size / sizeof(u32); + fw_header = (struct fw_header *) firmware->data; + load_addr = fore200e->virt_base + le32_to_cpu(fw_header->load_offset); + + DPRINTK(2, "device %s firmware being loaded at 0x%p (%d words)\n", + fore200e->name, load_addr, fw_size); + + if (le32_to_cpu(fw_header->magic) != FW_HEADER_MAGIC) { + printk(FORE200E "corrupted %s firmware image\n", fore200e->bus->model_name); + goto release; + } + + for (; fw_size--; fw_data++, load_addr++) + fore200e->bus->write(le32_to_cpu(*fw_data), load_addr); DPRINTK(2, "device %s firmware being started\n", fore200e->name); @@ -2567,58 +2533,33 @@ fore200e_start_fw(struct fore200e* fore200e) fore200e_spin(100); #endif - sprintf(cmd, "\rgo %x\r", le32_to_cpu(fw_header->start_offset)); + sprintf(buf, "\rgo %x\r", le32_to_cpu(fw_header->start_offset)); + fore200e_monitor_puts(fore200e, buf); - fore200e_monitor_puts(fore200e, cmd); - - ok = fore200e_io_poll(fore200e, &fore200e->cp_monitor->bstat, BSTAT_CP_RUNNING, 1000); - if (ok == 0) { + if (fore200e_io_poll(fore200e, &fore200e->cp_monitor->bstat, BSTAT_CP_RUNNING, 1000) == 0) { printk(FORE200E "device %s firmware didn't start\n", fore200e->name); - return -ENODEV; + goto release; } printk(FORE200E "device %s firmware started\n", fore200e->name); fore200e->state = FORE200E_STATE_START_FW; - return 0; -} - - -static int __devinit -fore200e_load_fw(struct fore200e* fore200e) -{ - __le32* fw_data = (__le32*) fore200e->bus->fw_data; - u32 fw_size = (u32) *fore200e->bus->fw_size / sizeof(u32); - - struct fw_header* fw_header = (struct fw_header*) fw_data; - - u32 __iomem *load_addr = fore200e->virt_base + le32_to_cpu(fw_header->load_offset); - - DPRINTK(2, "device %s firmware being loaded at 0x%p (%d words)\n", - fore200e->name, load_addr, fw_size); - - if (le32_to_cpu(fw_header->magic) != FW_HEADER_MAGIC) { - printk(FORE200E "corrupted %s firmware image\n", fore200e->bus->model_name); - return -ENODEV; - } + err = 0; - for (; fw_size--; fw_data++, load_addr++) - fore200e->bus->write(le32_to_cpu(*fw_data), load_addr); - - fore200e->state = FORE200E_STATE_LOAD_FW; - return 0; +release: + release_firmware(firmware); + return err; } -static int __devinit -fore200e_register(struct fore200e* fore200e) +static int fore200e_register(struct fore200e *fore200e, struct device *parent) { struct atm_dev* atm_dev; DPRINTK(2, "device %s being registered\n", fore200e->name); - atm_dev = atm_dev_register(fore200e->bus->proc_name, &fore200e_ops, -1, - NULL); + atm_dev = atm_dev_register(fore200e->bus->proc_name, parent, &fore200e_ops, + -1, NULL); if (atm_dev == NULL) { printk(FORE200E "unable to register device %s\n", fore200e->name); return -ENODEV; @@ -2637,10 +2578,9 @@ fore200e_register(struct fore200e* fore200e) } -static int __devinit -fore200e_init(struct fore200e* fore200e) +static int fore200e_init(struct fore200e *fore200e, struct device *parent) { - if (fore200e_register(fore200e) < 0) + if (fore200e_register(fore200e, parent) < 0) return -ENODEV; if (fore200e->bus->configure(fore200e) < 0) @@ -2652,10 +2592,7 @@ fore200e_init(struct fore200e* fore200e) if (fore200e_reset(fore200e, 1) < 0) return -ENODEV; - if (fore200e_load_fw(fore200e) < 0) - return -ENODEV; - - if (fore200e_start_fw(fore200e) < 0) + if (fore200e_load_and_start_fw(fore200e) < 0) return -ENODEV; if (fore200e_initialize(fore200e) < 0) @@ -2689,9 +2626,78 @@ fore200e_init(struct fore200e* fore200e) return 0; } -#ifdef CONFIG_ATM_FORE200E_PCA -static int __devinit -fore200e_pca_detect(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent) +#ifdef CONFIG_SBUS +static const struct of_device_id fore200e_sba_match[]; +static int fore200e_sba_probe(struct platform_device *op) +{ + const struct of_device_id *match; + const struct fore200e_bus *bus; + struct fore200e *fore200e; + static int index = 0; + int err; + + match = of_match_device(fore200e_sba_match, &op->dev); + if (!match) + return -EINVAL; + bus = match->data; + + fore200e = kzalloc(sizeof(struct fore200e), GFP_KERNEL); + if (!fore200e) + return -ENOMEM; + + fore200e->bus = bus; + fore200e->bus_dev = op; + fore200e->irq = op->archdata.irqs[0]; + fore200e->phys_base = op->resource[0].start; + + sprintf(fore200e->name, "%s-%d", bus->model_name, index); + + err = fore200e_init(fore200e, &op->dev); + if (err < 0) { + fore200e_shutdown(fore200e); + kfree(fore200e); + return err; + } + + index++; + dev_set_drvdata(&op->dev, fore200e); + + return 0; +} + +static int fore200e_sba_remove(struct platform_device *op) +{ + struct fore200e *fore200e = dev_get_drvdata(&op->dev); + + fore200e_shutdown(fore200e); + kfree(fore200e); + + return 0; +} + +static const struct of_device_id fore200e_sba_match[] = { + { + .name = SBA200E_PROM_NAME, + .data = (void *) &fore200e_bus[1], + }, + {}, +}; +MODULE_DEVICE_TABLE(of, fore200e_sba_match); + +static struct platform_driver fore200e_sba_driver = { + .driver = { + .name = "fore_200e", + .owner = THIS_MODULE, + .of_match_table = fore200e_sba_match, + }, + .probe = fore200e_sba_probe, + .remove = fore200e_sba_remove, +}; +#endif + +#ifdef CONFIG_PCI +static int fore200e_pca_detect(struct pci_dev *pci_dev, + const struct pci_device_id *pci_ent) { const struct fore200e_bus* bus = (struct fore200e_bus*) pci_ent->driver_data; struct fore200e* fore200e; @@ -2724,7 +2730,7 @@ fore200e_pca_detect(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent sprintf(fore200e->name, "%s-%d", bus->model_name, index); - err = fore200e_init(fore200e); + err = fore200e_init(fore200e, &pci_dev->dev); if (err < 0) { fore200e_shutdown(fore200e); goto out_free; @@ -2744,7 +2750,7 @@ out_disable: } -static void __devexit fore200e_pca_remove_one(struct pci_dev *pci_dev) +static void fore200e_pca_remove_one(struct pci_dev *pci_dev) { struct fore200e *fore200e; @@ -2767,72 +2773,45 @@ MODULE_DEVICE_TABLE(pci, fore200e_pca_tbl); static struct pci_driver fore200e_pca_driver = { .name = "fore_200e", .probe = fore200e_pca_detect, - .remove = __devexit_p(fore200e_pca_remove_one), + .remove = fore200e_pca_remove_one, .id_table = fore200e_pca_tbl, }; #endif - -static int __init -fore200e_module_init(void) +static int __init fore200e_module_init(void) { - const struct fore200e_bus* bus; - struct fore200e* fore200e; - int index; - - printk(FORE200E "FORE Systems 200E-series ATM driver - version " FORE200E_VERSION "\n"); - - /* for each configured bus interface */ - for (bus = fore200e_bus; bus->model_name; bus++) { - - /* detect all boards present on that bus */ - for (index = 0; bus->detect && (fore200e = bus->detect(bus, index)); index++) { - - printk(FORE200E "device %s found at 0x%lx, IRQ %s\n", - fore200e->bus->model_name, - fore200e->phys_base, fore200e_irq_itoa(fore200e->irq)); - - sprintf(fore200e->name, "%s-%d", bus->model_name, index); + int err = 0; - if (fore200e_init(fore200e) < 0) { + printk(FORE200E "FORE Systems 200E-series ATM driver - version " FORE200E_VERSION "\n"); - fore200e_shutdown(fore200e); - break; - } - - list_add(&fore200e->entry, &fore200e_boards); - } - } +#ifdef CONFIG_SBUS + err = platform_driver_register(&fore200e_sba_driver); + if (err) + return err; +#endif -#ifdef CONFIG_ATM_FORE200E_PCA - if (!pci_register_driver(&fore200e_pca_driver)) - return 0; +#ifdef CONFIG_PCI + err = pci_register_driver(&fore200e_pca_driver); #endif - if (!list_empty(&fore200e_boards)) - return 0; +#ifdef CONFIG_SBUS + if (err) + platform_driver_unregister(&fore200e_sba_driver); +#endif - return -ENODEV; + return err; } - -static void __exit -fore200e_module_cleanup(void) +static void __exit fore200e_module_cleanup(void) { - struct fore200e *fore200e, *next; - -#ifdef CONFIG_ATM_FORE200E_PCA - pci_unregister_driver(&fore200e_pca_driver); +#ifdef CONFIG_PCI + pci_unregister_driver(&fore200e_pca_driver); +#endif +#ifdef CONFIG_SBUS + platform_driver_unregister(&fore200e_sba_driver); #endif - - list_for_each_entry_safe(fore200e, next, &fore200e_boards, entry) { - fore200e_shutdown(fore200e); - kfree(fore200e); - } - DPRINTK(1, "module being removed\n"); } - static int fore200e_proc_read(struct atm_dev *dev, loff_t* pos, char* page) { @@ -2859,13 +2838,12 @@ fore200e_proc_read(struct atm_dev *dev, loff_t* pos, char* page) " interrupt line:\t\t%s\n" " physical base address:\t0x%p\n" " virtual base address:\t0x%p\n" - " factory address (ESI):\t%02x:%02x:%02x:%02x:%02x:%02x\n" + " factory address (ESI):\t%pM\n" " board serial number:\t\t%d\n\n", fore200e_irq_itoa(fore200e->irq), (void*)fore200e->phys_base, fore200e->virt_base, - fore200e->esi[0], fore200e->esi[1], fore200e->esi[2], - fore200e->esi[3], fore200e->esi[4], fore200e->esi[5], + fore200e->esi, fore200e->esi[4] * 256 + fore200e->esi[5]); return len; @@ -2920,8 +2898,8 @@ fore200e_proc_read(struct atm_dev *dev, loff_t* pos, char* page) u32 media_index = FORE200E_MEDIA_INDEX(fore200e->bus->read(&fore200e->cp_queues->media_type)); u32 oc3_index; - if ((media_index < 0) || (media_index > 4)) - media_index = 5; + if (media_index > 4) + media_index = 5; switch (fore200e->loop_mode) { case ATM_LM_NONE: oc3_index = 0; @@ -3140,19 +3118,9 @@ static const struct atmdev_ops fore200e_ops = }; -#ifdef CONFIG_ATM_FORE200E_PCA -extern const unsigned char _fore200e_pca_fw_data[]; -extern const unsigned int _fore200e_pca_fw_size; -#endif -#ifdef CONFIG_ATM_FORE200E_SBA -extern const unsigned char _fore200e_sba_fw_data[]; -extern const unsigned int _fore200e_sba_fw_size; -#endif - static const struct fore200e_bus fore200e_bus[] = { -#ifdef CONFIG_ATM_FORE200E_PCA +#ifdef CONFIG_PCI { "PCA-200E", "pca200e", 32, 4, 32, - _fore200e_pca_fw_data, &_fore200e_pca_fw_size, fore200e_pca_read, fore200e_pca_write, fore200e_pca_dma_map, @@ -3161,7 +3129,6 @@ static const struct fore200e_bus fore200e_bus[] = { fore200e_pca_dma_sync_for_device, fore200e_pca_dma_chunk_alloc, fore200e_pca_dma_chunk_free, - NULL, fore200e_pca_configure, fore200e_pca_map, fore200e_pca_reset, @@ -3173,9 +3140,8 @@ static const struct fore200e_bus fore200e_bus[] = { fore200e_pca_proc_read, }, #endif -#ifdef CONFIG_ATM_FORE200E_SBA +#ifdef CONFIG_SBUS { "SBA-200E", "sba200e", 32, 64, 32, - _fore200e_sba_fw_data, &_fore200e_sba_fw_size, fore200e_sba_read, fore200e_sba_write, fore200e_sba_dma_map, @@ -3184,7 +3150,6 @@ static const struct fore200e_bus fore200e_bus[] = { fore200e_sba_dma_sync_for_device, fore200e_sba_dma_chunk_alloc, fore200e_sba_dma_chunk_free, - fore200e_sba_detect, fore200e_sba_configure, fore200e_sba_map, fore200e_sba_reset, @@ -3199,6 +3164,14 @@ static const struct fore200e_bus fore200e_bus[] = { {} }; -#ifdef MODULE_LICENSE MODULE_LICENSE("GPL"); +#ifdef CONFIG_PCI +#ifdef __LITTLE_ENDIAN__ +MODULE_FIRMWARE("pca200e.bin"); +#else +MODULE_FIRMWARE("pca200e_ecd.bin2"); +#endif +#endif /* CONFIG_PCI */ +#ifdef CONFIG_SBUS +MODULE_FIRMWARE("sba200e_ecd.bin2"); #endif diff --git a/drivers/atm/fore200e.h b/drivers/atm/fore200e.h index 183841cc8fd..ba34a02b717 100644 --- a/drivers/atm/fore200e.h +++ b/drivers/atm/fore200e.h @@ -1,4 +1,3 @@ -/* $Id: fore200e.h,v 1.4 2000/04/14 10:10:34 davem Exp $ */ #ifndef _FORE200E_H #define _FORE200E_H @@ -264,7 +263,7 @@ typedef enum opcode { } opcode_t; -/* virtual path / virtual channel identifers */ +/* virtual path / virtual channel identifiers */ typedef struct vpvc { BITFIELD3( @@ -755,7 +754,6 @@ typedef enum fore200e_state { FORE200E_STATE_CONFIGURE, /* bus interface configured */ FORE200E_STATE_MAP, /* board space mapped in host memory */ FORE200E_STATE_RESET, /* board resetted */ - FORE200E_STATE_LOAD_FW, /* firmware loaded */ FORE200E_STATE_START_FW, /* firmware started */ FORE200E_STATE_INITIALIZE, /* initialize command successful */ FORE200E_STATE_INIT_CMDQ, /* command queue initialized */ @@ -780,9 +778,9 @@ typedef struct fore200e_pca_regs { /* SBA-200E registers */ typedef struct fore200e_sba_regs { - volatile u32 __iomem *hcr; /* address of host control register */ - volatile u32 __iomem *bsr; /* address of burst transfer size register */ - volatile u32 __iomem *isr; /* address of interrupt level selection register */ + u32 __iomem *hcr; /* address of host control register */ + u32 __iomem *bsr; /* address of burst transfer size register */ + u32 __iomem *isr; /* address of interrupt level selection register */ } fore200e_sba_regs_t; @@ -804,8 +802,6 @@ typedef struct fore200e_bus { int descr_alignment; /* tpd/rpd/rbd DMA alignment requirement */ int buffer_alignment; /* rx buffers DMA alignment requirement */ int status_alignment; /* status words DMA alignment requirement */ - const unsigned char* fw_data; /* address of firmware data start */ - const unsigned int* fw_size; /* address of firmware data size */ u32 (*read)(volatile u32 __iomem *); void (*write)(u32, volatile u32 __iomem *); u32 (*dma_map)(struct fore200e*, void*, int, int); @@ -814,7 +810,6 @@ typedef struct fore200e_bus { void (*dma_sync_for_device)(struct fore200e*, u32, int, int); int (*dma_chunk_alloc)(struct fore200e*, struct chunk*, int, int, int); void (*dma_chunk_free)(struct fore200e*, struct chunk*); - struct fore200e* (*detect)(const struct fore200e_bus*, int); int (*configure)(struct fore200e*); int (*map)(struct fore200e*); void (*reset)(struct fore200e*); @@ -931,7 +926,7 @@ typedef struct fore200e_vcc { #define PCA200E_PCI_LATENCY 0x40 /* maximum slave latenty */ #define PCA200E_PCI_MASTER_CTRL 0x41 /* master control */ -#define PCA200E_PCI_THRESHOLD 0x42 /* burst / continous req threshold */ +#define PCA200E_PCI_THRESHOLD 0x42 /* burst / continuous req threshold */ /* PBI master control register */ diff --git a/drivers/atm/fore200e_firmware_copyright b/drivers/atm/fore200e_firmware_copyright deleted file mode 100644 index d58e6490836..00000000000 --- a/drivers/atm/fore200e_firmware_copyright +++ /dev/null @@ -1,31 +0,0 @@ - -These microcode data are placed under the terms of the GNU General Public License. - -We would prefer you not to distribute modified versions of it and not to ask -for assembly or other microcode source. - -Copyright (c) 1995-2000 FORE Systems, Inc., as an unpublished work. This -notice does not imply unrestricted or public access to these materials which -are a trade secret of FORE Systems, Inc. or its subsidiaries or affiliates -(together referred to as "FORE"), and which may not be reproduced, used, sold -or transferred to any third party without FORE's prior written consent. All -rights reserved. - -U.S. Government Restricted Rights. If you are licensing the Software on -behalf of the U.S. Government ("Government"), the following provisions apply -to you. If the software is supplied to the Department of Defense ("DoD"), it -is classified as "Commercial Computer Software" under paragraph 252.227-7014 -of the DoD Supplement to the Federal Acquisition Regulations ("DFARS") (or any -successor regulations) and the Government is acquiring only the license -rights granted herein (the license rights customarily provided to non-Government -users). If the Software is supplied to any unit or agency of the Government -other than the DoD, it is classified as "Restricted Computer Software" and -the Government's rights in the Software are defined in paragraph 52.227-19 of -the Federal Acquisition Regulations ("FAR") (or any successor regulations) or, -in the cases of NASA, in paragraph 18.52.227-86 of the NASA Supplement to the FAR -(or any successor regulations). - -FORE Systems is a registered trademark, and ForeRunner, ForeRunnerLE, and -ForeThought are trademarks of FORE Systems, Inc. All other brands or product -names are trademarks or registered trademarks of their respective holders. - diff --git a/drivers/atm/fore200e_mkfirm.c b/drivers/atm/fore200e_mkfirm.c deleted file mode 100644 index 2ebe1a1e6f8..00000000000 --- a/drivers/atm/fore200e_mkfirm.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - $Id: fore200e_mkfirm.c,v 1.1 2000/02/21 16:04:32 davem Exp $ - - mkfirm.c: generates a C readable file from a binary firmware image - - Christophe Lizzi (lizzi@{csti.fr, cnam.fr}), June 1999. - - This software may be used and distributed according to the terms - of the GNU General Public License, incorporated herein by reference. -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <sys/types.h> -#include <time.h> - -char* default_basename = "pca200e"; /* was initially written for the PCA-200E firmware */ -char* default_infname = "<stdin>"; -char* default_outfname = "<stdout>"; - -char* progname; -int verbose = 0; -int inkernel = 0; - - -void usage(void) -{ - fprintf(stderr, - "%s: [-v] [-k] [-b basename ] [-i firmware.bin] [-o firmware.c]\n", - progname); - exit(-1); -} - - -int main(int argc, char** argv) -{ - time_t now; - char* infname = NULL; - char* outfname = NULL; - char* basename = NULL; - FILE* infile; - FILE* outfile; - unsigned firmsize; - int c; - - progname = *(argv++); - - while (argc > 1) { - if ((*argv)[0] == '-') { - switch ((*argv)[1]) { - case 'i': - if (argc-- < 3) - usage(); - infname = *(++argv); - break; - case 'o': - if (argc-- < 3) - usage(); - outfname = *(++argv); - break; - case 'b': - if (argc-- < 3) - usage(); - basename = *(++argv); - break; - case 'v': - verbose = 1; - break; - case 'k': - inkernel = 1; - break; - default: - usage(); - } - } - else { - usage(); - } - argc--; - argv++; - } - - if (infname != NULL) { - infile = fopen(infname, "r"); - if (infile == NULL) { - fprintf(stderr, "%s: can't open %s for reading\n", - progname, infname); - exit(-2); - } - } - else { - infile = stdin; - infname = default_infname; - } - - if (outfname) { - outfile = fopen(outfname, "w"); - if (outfile == NULL) { - fprintf(stderr, "%s: can't open %s for writing\n", - progname, outfname); - exit(-3); - } - } - else { - outfile = stdout; - outfname = default_outfname; - } - - if (basename == NULL) - basename = default_basename; - - if (verbose) { - fprintf(stderr, "%s: input file = %s\n", progname, infname ); - fprintf(stderr, "%s: output file = %s\n", progname, outfname ); - fprintf(stderr, "%s: firmware basename = %s\n", progname, basename ); - } - - time(&now); - fprintf(outfile, "/*\n generated by %s from %s on %s" - " DO NOT EDIT!\n*/\n\n", - progname, infname, ctime(&now)); - - if (inkernel) - fprintf(outfile, "#include <linux/init.h>\n\n" ); - - /* XXX force 32 bit alignment? */ - fprintf(outfile, "const unsigned char%s %s_data[] = {\n", - inkernel ? " __initdata" : "", basename ); - - c = getc(infile); - fprintf(outfile,"\t0x%02x", c); - firmsize = 1; - - while ((c = getc(infile)) >= 0) { - - if (firmsize++ % 8) - fprintf(outfile,", 0x%02x", c); - else - fprintf(outfile,",\n\t0x%02x", c); - } - - fprintf(outfile, "\n};\n\n"); - - fprintf(outfile, "const unsigned int%s %s_size = %u;\n", - inkernel ? " __initdata" : "", basename, firmsize ); - - if (infile != stdin) - fclose(infile); - if (outfile != stdout) - fclose(outfile); - - if(verbose) - fprintf(stderr, "%s: firmware size = %u\n", progname, firmsize); - - exit(0); -} diff --git a/drivers/atm/he.c b/drivers/atm/he.c index ffc4a5a4194..aa6be269866 100644 --- a/drivers/atm/he.c +++ b/drivers/atm/he.c @@ -67,6 +67,8 @@ #include <linux/timer.h> #include <linux/interrupt.h> #include <linux/dma-mapping.h> +#include <linux/bitmap.h> +#include <linux/slab.h> #include <asm/io.h> #include <asm/byteorder.h> #include <asm/uaccess.h> @@ -75,14 +77,8 @@ #include <linux/atm.h> #include <linux/sonet.h> -#define USE_TASKLET #undef USE_SCATTERGATHER #undef USE_CHECKSUM_HW /* still confused about this */ -#define USE_RBPS -#undef USE_RBPS_POOL /* if memory is tight try this */ -#undef USE_RBPL_POOL /* if memory is tight try this */ -#define USE_TPD_POOL -/* #undef CONFIG_ATM_HE_USE_SUNI */ /* #undef HE_DEBUG */ #include "he.h" @@ -116,12 +112,12 @@ static u8 read_prom_byte(struct he_dev *he_dev, int addr); /* globals */ static struct he_dev *he_devs; -static int disable64; +static bool disable64; static short nvpibits = -1; static short nvcibits = -1; static short rx_skb_reserve = 16; -static int irq_coalesce = 1; -static int sdh = 0; +static bool irq_coalesce = 1; +static bool sdh = 0; /* Read from EEPROM = 0000 0011b */ static unsigned int readtab[] = { @@ -333,7 +329,6 @@ __find_vcc(struct he_dev *he_dev, unsigned cid) { struct hlist_head *head; struct atm_vcc *vcc; - struct hlist_node *node; struct sock *s; short vpi; int vci; @@ -342,7 +337,7 @@ __find_vcc(struct he_dev *he_dev, unsigned cid) vci = cid & ((1 << he_dev->vcibits) - 1); head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)]; - sk_for_each(s, node, head) { + sk_for_each(s, head) { vcc = atm_sk(s); if (vcc->dev == he_dev->atm_dev && vcc->vci == vci && vcc->vpi == vpi && @@ -353,8 +348,8 @@ __find_vcc(struct he_dev *he_dev, unsigned cid) return NULL; } -static int __devinit -he_init_one(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent) +static int he_init_one(struct pci_dev *pci_dev, + const struct pci_device_id *pci_ent) { struct atm_dev *atm_dev = NULL; struct he_dev *he_dev = NULL; @@ -364,13 +359,13 @@ he_init_one(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent) if (pci_enable_device(pci_dev)) return -EIO; - if (pci_set_dma_mask(pci_dev, DMA_32BIT_MASK) != 0) { + if (pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32)) != 0) { printk(KERN_WARNING "he: no suitable dma available\n"); err = -EIO; goto init_one_failure; } - atm_dev = atm_dev_register(DEV_LABEL, &he_ops, -1, NULL); + atm_dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &he_ops, -1, NULL); if (!atm_dev) { err = -ENODEV; goto init_one_failure; @@ -388,9 +383,7 @@ he_init_one(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent) he_dev->atm_dev->dev_data = he_dev; atm_dev->dev_data = he_dev; he_dev->number = atm_dev->number; -#ifdef USE_TASKLET tasklet_init(&he_dev->tasklet, he_tasklet, (unsigned long) he_dev); -#endif spin_lock_init(&he_dev->global_lock); if (he_start(atm_dev)) { @@ -412,8 +405,7 @@ init_one_failure: return err; } -static void __devexit -he_remove_one (struct pci_dev *pci_dev) +static void he_remove_one(struct pci_dev *pci_dev) { struct atm_dev *atm_dev; struct he_dev *he_dev; @@ -427,7 +419,6 @@ he_remove_one (struct pci_dev *pci_dev) atm_dev_deregister(atm_dev); kfree(he_dev); - pci_set_drvdata(pci_dev, NULL); pci_disable_device(pci_dev); } @@ -451,8 +442,7 @@ rate_to_atmf(unsigned rate) /* cps to atm forum format */ return (NONZERO | (exp << 9) | (rate & 0x1ff)); } -static void __devinit -he_init_rx_lbfp0(struct he_dev *he_dev) +static void he_init_rx_lbfp0(struct he_dev *he_dev) { unsigned i, lbm_offset, lbufd_index, lbuf_addr, lbuf_count; unsigned lbufs_per_row = he_dev->cells_per_row / he_dev->cells_per_lbuf; @@ -482,8 +472,7 @@ he_init_rx_lbfp0(struct he_dev *he_dev) he_writel(he_dev, he_dev->r0_numbuffs, RLBF0_C); } -static void __devinit -he_init_rx_lbfp1(struct he_dev *he_dev) +static void he_init_rx_lbfp1(struct he_dev *he_dev) { unsigned i, lbm_offset, lbufd_index, lbuf_addr, lbuf_count; unsigned lbufs_per_row = he_dev->cells_per_row / he_dev->cells_per_lbuf; @@ -513,8 +502,7 @@ he_init_rx_lbfp1(struct he_dev *he_dev) he_writel(he_dev, he_dev->r1_numbuffs, RLBF1_C); } -static void __devinit -he_init_tx_lbfp(struct he_dev *he_dev) +static void he_init_tx_lbfp(struct he_dev *he_dev) { unsigned i, lbm_offset, lbufd_index, lbuf_addr, lbuf_count; unsigned lbufs_per_row = he_dev->cells_per_row / he_dev->cells_per_lbuf; @@ -543,8 +531,7 @@ he_init_tx_lbfp(struct he_dev *he_dev) he_writel(he_dev, lbufd_index - 1, TLBF_T); } -static int __devinit -he_init_tpdrq(struct he_dev *he_dev) +static int he_init_tpdrq(struct he_dev *he_dev) { he_dev->tpdrq_base = pci_alloc_consistent(he_dev->pci_dev, CONFIG_TPDRQ_SIZE * sizeof(struct he_tpdrq), &he_dev->tpdrq_phys); @@ -565,8 +552,7 @@ he_init_tpdrq(struct he_dev *he_dev) return 0; } -static void __devinit -he_init_cs_block(struct he_dev *he_dev) +static void he_init_cs_block(struct he_dev *he_dev) { unsigned clock, rate, delta; int reg; @@ -661,8 +647,7 @@ he_init_cs_block(struct he_dev *he_dev) } -static int __devinit -he_init_cs_block_rcm(struct he_dev *he_dev) +static int he_init_cs_block_rcm(struct he_dev *he_dev) { unsigned (*rategrid)[16][16]; unsigned rate, delta; @@ -782,125 +767,73 @@ he_init_cs_block_rcm(struct he_dev *he_dev) return 0; } -static int __devinit -he_init_group(struct he_dev *he_dev, int group) +static int he_init_group(struct he_dev *he_dev, int group) { + struct he_buff *heb, *next; + dma_addr_t mapping; int i; -#ifdef USE_RBPS - /* small buffer pool */ -#ifdef USE_RBPS_POOL - he_dev->rbps_pool = pci_pool_create("rbps", he_dev->pci_dev, - CONFIG_RBPS_BUFSIZE, 8, 0); - if (he_dev->rbps_pool == NULL) { - hprintk("unable to create rbps pages\n"); - return -ENOMEM; - } -#else /* !USE_RBPS_POOL */ - he_dev->rbps_pages = pci_alloc_consistent(he_dev->pci_dev, - CONFIG_RBPS_SIZE * CONFIG_RBPS_BUFSIZE, &he_dev->rbps_pages_phys); - if (he_dev->rbps_pages == NULL) { - hprintk("unable to create rbps page pool\n"); - return -ENOMEM; - } -#endif /* USE_RBPS_POOL */ + he_writel(he_dev, 0x0, G0_RBPS_S + (group * 32)); + he_writel(he_dev, 0x0, G0_RBPS_T + (group * 32)); + he_writel(he_dev, 0x0, G0_RBPS_QI + (group * 32)); + he_writel(he_dev, RBP_THRESH(0x1) | RBP_QSIZE(0x0), + G0_RBPS_BS + (group * 32)); - he_dev->rbps_base = pci_alloc_consistent(he_dev->pci_dev, - CONFIG_RBPS_SIZE * sizeof(struct he_rbp), &he_dev->rbps_phys); - if (he_dev->rbps_base == NULL) { - hprintk("failed to alloc rbps\n"); + /* bitmap table */ + he_dev->rbpl_table = kmalloc(BITS_TO_LONGS(RBPL_TABLE_SIZE) + * sizeof(unsigned long), GFP_KERNEL); + if (!he_dev->rbpl_table) { + hprintk("unable to allocate rbpl bitmap table\n"); return -ENOMEM; } - memset(he_dev->rbps_base, 0, CONFIG_RBPS_SIZE * sizeof(struct he_rbp)); - he_dev->rbps_virt = kmalloc(CONFIG_RBPS_SIZE * sizeof(struct he_virt), GFP_KERNEL); - - for (i = 0; i < CONFIG_RBPS_SIZE; ++i) { - dma_addr_t dma_handle; - void *cpuaddr; - -#ifdef USE_RBPS_POOL - cpuaddr = pci_pool_alloc(he_dev->rbps_pool, GFP_KERNEL|GFP_DMA, &dma_handle); - if (cpuaddr == NULL) - return -ENOMEM; -#else - cpuaddr = he_dev->rbps_pages + (i * CONFIG_RBPS_BUFSIZE); - dma_handle = he_dev->rbps_pages_phys + (i * CONFIG_RBPS_BUFSIZE); -#endif - - he_dev->rbps_virt[i].virt = cpuaddr; - he_dev->rbps_base[i].status = RBP_LOANED | RBP_SMALLBUF | (i << RBP_INDEX_OFF); - he_dev->rbps_base[i].phys = dma_handle; + bitmap_zero(he_dev->rbpl_table, RBPL_TABLE_SIZE); + /* rbpl_virt 64-bit pointers */ + he_dev->rbpl_virt = kmalloc(RBPL_TABLE_SIZE + * sizeof(struct he_buff *), GFP_KERNEL); + if (!he_dev->rbpl_virt) { + hprintk("unable to allocate rbpl virt table\n"); + goto out_free_rbpl_table; } - he_dev->rbps_tail = &he_dev->rbps_base[CONFIG_RBPS_SIZE - 1]; - - he_writel(he_dev, he_dev->rbps_phys, G0_RBPS_S + (group * 32)); - he_writel(he_dev, RBPS_MASK(he_dev->rbps_tail), - G0_RBPS_T + (group * 32)); - he_writel(he_dev, CONFIG_RBPS_BUFSIZE/4, - G0_RBPS_BS + (group * 32)); - he_writel(he_dev, - RBP_THRESH(CONFIG_RBPS_THRESH) | - RBP_QSIZE(CONFIG_RBPS_SIZE - 1) | - RBP_INT_ENB, - G0_RBPS_QI + (group * 32)); -#else /* !USE_RBPS */ - he_writel(he_dev, 0x0, G0_RBPS_S + (group * 32)); - he_writel(he_dev, 0x0, G0_RBPS_T + (group * 32)); - he_writel(he_dev, 0x0, G0_RBPS_QI + (group * 32)); - he_writel(he_dev, RBP_THRESH(0x1) | RBP_QSIZE(0x0), - G0_RBPS_BS + (group * 32)); -#endif /* USE_RBPS */ /* large buffer pool */ -#ifdef USE_RBPL_POOL he_dev->rbpl_pool = pci_pool_create("rbpl", he_dev->pci_dev, - CONFIG_RBPL_BUFSIZE, 8, 0); + CONFIG_RBPL_BUFSIZE, 64, 0); if (he_dev->rbpl_pool == NULL) { hprintk("unable to create rbpl pool\n"); - return -ENOMEM; - } -#else /* !USE_RBPL_POOL */ - he_dev->rbpl_pages = (void *) pci_alloc_consistent(he_dev->pci_dev, - CONFIG_RBPL_SIZE * CONFIG_RBPL_BUFSIZE, &he_dev->rbpl_pages_phys); - if (he_dev->rbpl_pages == NULL) { - hprintk("unable to create rbpl pages\n"); - return -ENOMEM; + goto out_free_rbpl_virt; } -#endif /* USE_RBPL_POOL */ he_dev->rbpl_base = pci_alloc_consistent(he_dev->pci_dev, CONFIG_RBPL_SIZE * sizeof(struct he_rbp), &he_dev->rbpl_phys); if (he_dev->rbpl_base == NULL) { - hprintk("failed to alloc rbpl\n"); - return -ENOMEM; + hprintk("failed to alloc rbpl_base\n"); + goto out_destroy_rbpl_pool; } memset(he_dev->rbpl_base, 0, CONFIG_RBPL_SIZE * sizeof(struct he_rbp)); - he_dev->rbpl_virt = kmalloc(CONFIG_RBPL_SIZE * sizeof(struct he_virt), GFP_KERNEL); + + INIT_LIST_HEAD(&he_dev->rbpl_outstanding); for (i = 0; i < CONFIG_RBPL_SIZE; ++i) { - dma_addr_t dma_handle; - void *cpuaddr; -#ifdef USE_RBPL_POOL - cpuaddr = pci_pool_alloc(he_dev->rbpl_pool, GFP_KERNEL|GFP_DMA, &dma_handle); - if (cpuaddr == NULL) - return -ENOMEM; -#else - cpuaddr = he_dev->rbpl_pages + (i * CONFIG_RBPL_BUFSIZE); - dma_handle = he_dev->rbpl_pages_phys + (i * CONFIG_RBPL_BUFSIZE); -#endif + heb = pci_pool_alloc(he_dev->rbpl_pool, GFP_KERNEL|GFP_DMA, &mapping); + if (!heb) + goto out_free_rbpl; + heb->mapping = mapping; + list_add(&heb->entry, &he_dev->rbpl_outstanding); - he_dev->rbpl_virt[i].virt = cpuaddr; - he_dev->rbpl_base[i].status = RBP_LOANED | (i << RBP_INDEX_OFF); - he_dev->rbpl_base[i].phys = dma_handle; + set_bit(i, he_dev->rbpl_table); + he_dev->rbpl_virt[i] = heb; + he_dev->rbpl_hint = i + 1; + he_dev->rbpl_base[i].idx = i << RBP_IDX_OFFSET; + he_dev->rbpl_base[i].phys = mapping + offsetof(struct he_buff, data); } he_dev->rbpl_tail = &he_dev->rbpl_base[CONFIG_RBPL_SIZE - 1]; he_writel(he_dev, he_dev->rbpl_phys, G0_RBPL_S + (group * 32)); he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail), G0_RBPL_T + (group * 32)); - he_writel(he_dev, CONFIG_RBPL_BUFSIZE/4, + he_writel(he_dev, (CONFIG_RBPL_BUFSIZE - sizeof(struct he_buff))/4, G0_RBPL_BS + (group * 32)); he_writel(he_dev, RBP_THRESH(CONFIG_RBPL_THRESH) | @@ -914,7 +847,7 @@ he_init_group(struct he_dev *he_dev, int group) CONFIG_RBRQ_SIZE * sizeof(struct he_rbrq), &he_dev->rbrq_phys); if (he_dev->rbrq_base == NULL) { hprintk("failed to allocate rbrq\n"); - return -ENOMEM; + goto out_free_rbpl; } memset(he_dev->rbrq_base, 0, CONFIG_RBRQ_SIZE * sizeof(struct he_rbrq)); @@ -938,7 +871,7 @@ he_init_group(struct he_dev *he_dev, int group) CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq), &he_dev->tbrq_phys); if (he_dev->tbrq_base == NULL) { hprintk("failed to allocate tbrq\n"); - return -ENOMEM; + goto out_free_rbpq_base; } memset(he_dev->tbrq_base, 0, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq)); @@ -950,10 +883,29 @@ he_init_group(struct he_dev *he_dev, int group) he_writel(he_dev, CONFIG_TBRQ_THRESH, G0_TBRQ_THRESH + (group * 16)); return 0; + +out_free_rbpq_base: + pci_free_consistent(he_dev->pci_dev, CONFIG_RBRQ_SIZE * + sizeof(struct he_rbrq), he_dev->rbrq_base, + he_dev->rbrq_phys); +out_free_rbpl: + list_for_each_entry_safe(heb, next, &he_dev->rbpl_outstanding, entry) + pci_pool_free(he_dev->rbpl_pool, heb, heb->mapping); + + pci_free_consistent(he_dev->pci_dev, CONFIG_RBPL_SIZE * + sizeof(struct he_rbp), he_dev->rbpl_base, + he_dev->rbpl_phys); +out_destroy_rbpl_pool: + pci_pool_destroy(he_dev->rbpl_pool); +out_free_rbpl_virt: + kfree(he_dev->rbpl_virt); +out_free_rbpl_table: + kfree(he_dev->rbpl_table); + + return -ENOMEM; } -static int __devinit -he_init_irq(struct he_dev *he_dev) +static int he_init_irq(struct he_dev *he_dev) { int i; @@ -1004,7 +956,8 @@ he_init_irq(struct he_dev *he_dev) he_writel(he_dev, 0x0, GRP_54_MAP); he_writel(he_dev, 0x0, GRP_76_MAP); - if (request_irq(he_dev->pci_dev->irq, he_irq_handler, IRQF_DISABLED|IRQF_SHARED, DEV_LABEL, he_dev)) { + if (request_irq(he_dev->pci_dev->irq, + he_irq_handler, IRQF_SHARED, DEV_LABEL, he_dev)) { hprintk("irq %d already in use\n", he_dev->pci_dev->irq); return -EINVAL; } @@ -1014,8 +967,7 @@ he_init_irq(struct he_dev *he_dev) return 0; } -static int __devinit -he_start(struct atm_dev *dev) +static int he_start(struct atm_dev *dev) { struct he_dev *he_dev; struct pci_dev *pci_dev; @@ -1102,7 +1054,7 @@ he_start(struct atm_dev *dev) he_writel(he_dev, 0x0, RESET_CNTL); he_writel(he_dev, 0xff, RESET_CNTL); - udelay(16*1000); /* 16 ms */ + msleep(16); /* 16 ms */ status = he_readl(he_dev, RESET_CNTL); if ((status & BOARD_RST_STATUS) == 0) { hprintk("reset failed\n"); @@ -1135,15 +1087,8 @@ he_start(struct atm_dev *dev) for (i = 0; i < 6; ++i) dev->esi[i] = read_prom_byte(he_dev, MAC_ADDR + i); - hprintk("%s%s, %x:%x:%x:%x:%x:%x\n", - he_dev->prod_id, - he_dev->media & 0x40 ? "SM" : "MM", - dev->esi[0], - dev->esi[1], - dev->esi[2], - dev->esi[3], - dev->esi[4], - dev->esi[5]); + hprintk("%s%s, %pM\n", he_dev->prod_id, + he_dev->media & 0x40 ? "SM" : "MM", dev->esi); he_dev->atm_dev->link_rate = he_is622(he_dev) ? ATM_OC12_PCR : ATM_OC3_PCR; @@ -1475,7 +1420,6 @@ he_start(struct atm_dev *dev) he_init_tpdrq(he_dev); -#ifdef USE_TPD_POOL he_dev->tpd_pool = pci_pool_create("tpd", he_dev->pci_dev, sizeof(struct he_tpd), TPD_ALIGNMENT, 0); if (he_dev->tpd_pool == NULL) { @@ -1484,20 +1428,6 @@ he_start(struct atm_dev *dev) } INIT_LIST_HEAD(&he_dev->outstanding_tpds); -#else - he_dev->tpd_base = (void *) pci_alloc_consistent(he_dev->pci_dev, - CONFIG_NUMTPDS * sizeof(struct he_tpd), &he_dev->tpd_base_phys); - if (!he_dev->tpd_base) - return -ENOMEM; - - for (i = 0; i < CONFIG_NUMTPDS; ++i) { - he_dev->tpd_base[i].status = (i << TPD_ADDR_SHIFT); - he_dev->tpd_base[i].inuse = 0; - } - - he_dev->tpd_head = he_dev->tpd_base; - he_dev->tpd_end = &he_dev->tpd_base[CONFIG_NUMTPDS - 1]; -#endif if (he_init_group(he_dev, 0) != 0) return -ENOMEM; @@ -1542,7 +1472,8 @@ he_start(struct atm_dev *dev) /* initialize framer */ #ifdef CONFIG_ATM_HE_USE_SUNI - suni_init(he_dev->atm_dev); + if (he_isMM(he_dev)) + suni_init(he_dev->atm_dev); if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->start) he_dev->atm_dev->phy->start(he_dev->atm_dev); #endif /* CONFIG_ATM_HE_USE_SUNI */ @@ -1554,6 +1485,7 @@ he_start(struct atm_dev *dev) val = he_phy_get(he_dev->atm_dev, SUNI_TPOP_APM); val = (val & ~SUNI_TPOP_APM_S) | (SUNI_TPOP_S_SDH << SUNI_TPOP_APM_S_SHIFT); he_phy_put(he_dev->atm_dev, val, SUNI_TPOP_APM); + he_phy_put(he_dev->atm_dev, SUNI_TACP_IUCHP_CLP, SUNI_TACP_IUCHP); } /* 5.1.12 enable transmit and receive */ @@ -1591,9 +1523,10 @@ he_start(struct atm_dev *dev) static void he_stop(struct he_dev *he_dev) { - u16 command; - u32 gen_cntl_0, reg; + struct he_buff *heb, *next; struct pci_dev *pci_dev; + u32 gen_cntl_0, reg; + u16 command; pci_dev = he_dev->pci_dev; @@ -1604,9 +1537,7 @@ he_stop(struct he_dev *he_dev) gen_cntl_0 &= ~(INT_PROC_ENBL | INIT_ENB); pci_write_config_dword(pci_dev, GEN_CNTL_0, gen_cntl_0); -#ifdef USE_TASKLET tasklet_disable(&he_dev->tasklet); -#endif /* disable recv and transmit */ @@ -1636,53 +1567,18 @@ he_stop(struct he_dev *he_dev) he_dev->hsp, he_dev->hsp_phys); if (he_dev->rbpl_base) { -#ifdef USE_RBPL_POOL - int i; + list_for_each_entry_safe(heb, next, &he_dev->rbpl_outstanding, entry) + pci_pool_free(he_dev->rbpl_pool, heb, heb->mapping); - for (i = 0; i < CONFIG_RBPL_SIZE; ++i) { - void *cpuaddr = he_dev->rbpl_virt[i].virt; - dma_addr_t dma_handle = he_dev->rbpl_base[i].phys; - - pci_pool_free(he_dev->rbpl_pool, cpuaddr, dma_handle); - } -#else - pci_free_consistent(he_dev->pci_dev, CONFIG_RBPL_SIZE - * CONFIG_RBPL_BUFSIZE, he_dev->rbpl_pages, he_dev->rbpl_pages_phys); -#endif pci_free_consistent(he_dev->pci_dev, CONFIG_RBPL_SIZE * sizeof(struct he_rbp), he_dev->rbpl_base, he_dev->rbpl_phys); } -#ifdef USE_RBPL_POOL + kfree(he_dev->rbpl_virt); + kfree(he_dev->rbpl_table); + if (he_dev->rbpl_pool) pci_pool_destroy(he_dev->rbpl_pool); -#endif - -#ifdef USE_RBPS - if (he_dev->rbps_base) { -#ifdef USE_RBPS_POOL - int i; - - for (i = 0; i < CONFIG_RBPS_SIZE; ++i) { - void *cpuaddr = he_dev->rbps_virt[i].virt; - dma_addr_t dma_handle = he_dev->rbps_base[i].phys; - - pci_pool_free(he_dev->rbps_pool, cpuaddr, dma_handle); - } -#else - pci_free_consistent(he_dev->pci_dev, CONFIG_RBPS_SIZE - * CONFIG_RBPS_BUFSIZE, he_dev->rbps_pages, he_dev->rbps_pages_phys); -#endif - pci_free_consistent(he_dev->pci_dev, CONFIG_RBPS_SIZE - * sizeof(struct he_rbp), he_dev->rbps_base, he_dev->rbps_phys); - } - -#ifdef USE_RBPS_POOL - if (he_dev->rbps_pool) - pci_pool_destroy(he_dev->rbps_pool); -#endif - -#endif /* USE_RBPS */ if (he_dev->rbrq_base) pci_free_consistent(he_dev->pci_dev, CONFIG_RBRQ_SIZE * sizeof(struct he_rbrq), @@ -1696,14 +1592,8 @@ he_stop(struct he_dev *he_dev) pci_free_consistent(he_dev->pci_dev, CONFIG_TBRQ_SIZE * sizeof(struct he_tbrq), he_dev->tpdrq_base, he_dev->tpdrq_phys); -#ifdef USE_TPD_POOL if (he_dev->tpd_pool) pci_pool_destroy(he_dev->tpd_pool); -#else - if (he_dev->tpd_base) - pci_free_consistent(he_dev->pci_dev, CONFIG_NUMTPDS * sizeof(struct he_tpd), - he_dev->tpd_base, he_dev->tpd_base_phys); -#endif if (he_dev->pci_dev) { pci_read_config_word(he_dev->pci_dev, PCI_COMMAND, &command); @@ -1718,42 +1608,20 @@ he_stop(struct he_dev *he_dev) static struct he_tpd * __alloc_tpd(struct he_dev *he_dev) { -#ifdef USE_TPD_POOL struct he_tpd *tpd; - dma_addr_t dma_handle; + dma_addr_t mapping; - tpd = pci_pool_alloc(he_dev->tpd_pool, GFP_ATOMIC|GFP_DMA, &dma_handle); + tpd = pci_pool_alloc(he_dev->tpd_pool, GFP_ATOMIC|GFP_DMA, &mapping); if (tpd == NULL) return NULL; - tpd->status = TPD_ADDR(dma_handle); + tpd->status = TPD_ADDR(mapping); tpd->reserved = 0; tpd->iovec[0].addr = 0; tpd->iovec[0].len = 0; tpd->iovec[1].addr = 0; tpd->iovec[1].len = 0; tpd->iovec[2].addr = 0; tpd->iovec[2].len = 0; return tpd; -#else - int i; - - for (i = 0; i < CONFIG_NUMTPDS; ++i) { - ++he_dev->tpd_head; - if (he_dev->tpd_head > he_dev->tpd_end) { - he_dev->tpd_head = he_dev->tpd_base; - } - - if (!he_dev->tpd_head->inuse) { - he_dev->tpd_head->inuse = 1; - he_dev->tpd_head->status &= TPD_MASK; - he_dev->tpd_head->iovec[0].addr = 0; he_dev->tpd_head->iovec[0].len = 0; - he_dev->tpd_head->iovec[1].addr = 0; he_dev->tpd_head->iovec[1].len = 0; - he_dev->tpd_head->iovec[2].addr = 0; he_dev->tpd_head->iovec[2].len = 0; - return he_dev->tpd_head; - } - } - hprintk("out of tpds -- increase CONFIG_NUMTPDS (%d)\n", CONFIG_NUMTPDS); - return NULL; -#endif } #define AAL5_LEN(buf,len) \ @@ -1776,13 +1644,12 @@ he_service_rbrq(struct he_dev *he_dev, int group) struct he_rbrq *rbrq_tail = (struct he_rbrq *) ((unsigned long)he_dev->rbrq_base | he_dev->hsp->group[group].rbrq_tail); - struct he_rbp *rbp = NULL; unsigned cid, lastcid = -1; - unsigned buf_len = 0; struct sk_buff *skb; struct atm_vcc *vcc = NULL; struct he_vcc *he_vcc; - struct he_iovec *iov; + struct he_buff *heb, *next; + int i; int pdus_assembled = 0; int updated = 0; @@ -1802,46 +1669,35 @@ he_service_rbrq(struct he_dev *he_dev, int group) RBRQ_CON_CLOSED(he_dev->rbrq_head) ? " CON_CLOSED" : "", RBRQ_HBUF_ERR(he_dev->rbrq_head) ? " HBUF_ERR" : ""); -#ifdef USE_RBPS - if (RBRQ_ADDR(he_dev->rbrq_head) & RBP_SMALLBUF) - rbp = &he_dev->rbps_base[RBP_INDEX(RBRQ_ADDR(he_dev->rbrq_head))]; - else -#endif - rbp = &he_dev->rbpl_base[RBP_INDEX(RBRQ_ADDR(he_dev->rbrq_head))]; - - buf_len = RBRQ_BUFLEN(he_dev->rbrq_head) * 4; - cid = RBRQ_CID(he_dev->rbrq_head); + i = RBRQ_ADDR(he_dev->rbrq_head) >> RBP_IDX_OFFSET; + heb = he_dev->rbpl_virt[i]; + cid = RBRQ_CID(he_dev->rbrq_head); if (cid != lastcid) vcc = __find_vcc(he_dev, cid); lastcid = cid; - if (vcc == NULL) { - hprintk("vcc == NULL (cid 0x%x)\n", cid); - if (!RBRQ_HBUF_ERR(he_dev->rbrq_head)) - rbp->status &= ~RBP_LOANED; + if (vcc == NULL || (he_vcc = HE_VCC(vcc)) == NULL) { + hprintk("vcc/he_vcc == NULL (cid 0x%x)\n", cid); + if (!RBRQ_HBUF_ERR(he_dev->rbrq_head)) { + clear_bit(i, he_dev->rbpl_table); + list_del(&heb->entry); + pci_pool_free(he_dev->rbpl_pool, heb, heb->mapping); + } goto next_rbrq_entry; } - he_vcc = HE_VCC(vcc); - if (he_vcc == NULL) { - hprintk("he_vcc == NULL (cid 0x%x)\n", cid); - if (!RBRQ_HBUF_ERR(he_dev->rbrq_head)) - rbp->status &= ~RBP_LOANED; - goto next_rbrq_entry; - } - if (RBRQ_HBUF_ERR(he_dev->rbrq_head)) { hprintk("HBUF_ERR! (cid 0x%x)\n", cid); atomic_inc(&vcc->stats->rx_drop); goto return_host_buffers; } - he_vcc->iov_tail->iov_base = RBRQ_ADDR(he_dev->rbrq_head); - he_vcc->iov_tail->iov_len = buf_len; - he_vcc->pdu_len += buf_len; - ++he_vcc->iov_tail; + heb->len = RBRQ_BUFLEN(he_dev->rbrq_head) * 4; + clear_bit(i, he_dev->rbpl_table); + list_move_tail(&heb->entry, &he_vcc->buffers); + he_vcc->pdu_len += heb->len; if (RBRQ_CON_CLOSED(he_dev->rbrq_head)) { lastcid = -1; @@ -1850,12 +1706,6 @@ he_service_rbrq(struct he_dev *he_dev, int group) goto return_host_buffers; } -#ifdef notdef - if ((he_vcc->iov_tail - he_vcc->iov_head) > HE_MAXIOV) { - hprintk("iovec full! cid 0x%x\n", cid); - goto return_host_buffers; - } -#endif if (!RBRQ_END_PDU(he_dev->rbrq_head)) goto next_rbrq_entry; @@ -1883,17 +1733,8 @@ he_service_rbrq(struct he_dev *he_dev, int group) __net_timestamp(skb); - for (iov = he_vcc->iov_head; - iov < he_vcc->iov_tail; ++iov) { -#ifdef USE_RBPS - if (iov->iov_base & RBP_SMALLBUF) - memcpy(skb_put(skb, iov->iov_len), - he_dev->rbps_virt[RBP_INDEX(iov->iov_base)].virt, iov->iov_len); - else -#endif - memcpy(skb_put(skb, iov->iov_len), - he_dev->rbpl_virt[RBP_INDEX(iov->iov_base)].virt, iov->iov_len); - } + list_for_each_entry(heb, &he_vcc->buffers, entry) + memcpy(skb_put(skb, heb->len), &heb->data, heb->len); switch (vcc->qos.aal) { case ATM_AAL0: @@ -1933,25 +1774,15 @@ he_service_rbrq(struct he_dev *he_dev, int group) return_host_buffers: ++pdus_assembled; - for (iov = he_vcc->iov_head; - iov < he_vcc->iov_tail; ++iov) { -#ifdef USE_RBPS - if (iov->iov_base & RBP_SMALLBUF) - rbp = &he_dev->rbps_base[RBP_INDEX(iov->iov_base)]; - else -#endif - rbp = &he_dev->rbpl_base[RBP_INDEX(iov->iov_base)]; - - rbp->status &= ~RBP_LOANED; - } - - he_vcc->iov_tail = he_vcc->iov_head; + list_for_each_entry_safe(heb, next, &he_vcc->buffers, entry) + pci_pool_free(he_dev->rbpl_pool, heb, heb->mapping); + INIT_LIST_HEAD(&he_vcc->buffers); he_vcc->pdu_len = 0; next_rbrq_entry: he_dev->rbrq_head = (struct he_rbrq *) ((unsigned long) he_dev->rbrq_base | - RBRQ_MASK(++he_dev->rbrq_head)); + RBRQ_MASK(he_dev->rbrq_head + 1)); } read_unlock(&vcc_sklist_lock); @@ -1975,9 +1806,7 @@ he_service_tbrq(struct he_dev *he_dev, int group) he_dev->hsp->group[group].tbrq_tail); struct he_tpd *tpd; int slot, updated = 0; -#ifdef USE_TPD_POOL struct he_tpd *__tpd; -#endif /* 2.1.6 transmit buffer return queue */ @@ -1989,7 +1818,6 @@ he_service_tbrq(struct he_dev *he_dev, int group) TBRQ_TPD(he_dev->tbrq_head), TBRQ_EOS(he_dev->tbrq_head) ? " EOS" : "", TBRQ_MULTIPLE(he_dev->tbrq_head) ? " MULTIPLE" : ""); -#ifdef USE_TPD_POOL tpd = NULL; list_for_each_entry(__tpd, &he_dev->outstanding_tpds, entry) { if (TPD_ADDR(__tpd->status) == TBRQ_TPD(he_dev->tbrq_head)) { @@ -2004,9 +1832,6 @@ he_service_tbrq(struct he_dev *he_dev, int group) TBRQ_TPD(he_dev->tbrq_head)); goto next_tbrq_entry; } -#else - tpd = &he_dev->tpd_base[ TPD_INDEX(TBRQ_TPD(he_dev->tbrq_head)) ]; -#endif if (TBRQ_EOS(he_dev->tbrq_head)) { HPRINTK("wake_up(tx_waitq) cid 0x%x\n", @@ -2036,15 +1861,11 @@ he_service_tbrq(struct he_dev *he_dev, int group) } next_tbrq_entry: -#ifdef USE_TPD_POOL if (tpd) pci_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status)); -#else - tpd->inuse = 0; -#endif he_dev->tbrq_head = (struct he_tbrq *) ((unsigned long) he_dev->tbrq_base | - TBRQ_MASK(++he_dev->tbrq_head)); + TBRQ_MASK(he_dev->tbrq_head + 1)); } if (updated) { @@ -2056,62 +1877,52 @@ next_tbrq_entry: } } - static void he_service_rbpl(struct he_dev *he_dev, int group) { - struct he_rbp *newtail; + struct he_rbp *new_tail; struct he_rbp *rbpl_head; + struct he_buff *heb; + dma_addr_t mapping; + int i; int moved = 0; rbpl_head = (struct he_rbp *) ((unsigned long)he_dev->rbpl_base | RBPL_MASK(he_readl(he_dev, G0_RBPL_S))); for (;;) { - newtail = (struct he_rbp *) ((unsigned long)he_dev->rbpl_base | + new_tail = (struct he_rbp *) ((unsigned long)he_dev->rbpl_base | RBPL_MASK(he_dev->rbpl_tail+1)); /* table 3.42 -- rbpl_tail should never be set to rbpl_head */ - if ((newtail == rbpl_head) || (newtail->status & RBP_LOANED)) + if (new_tail == rbpl_head) break; - newtail->status |= RBP_LOANED; - he_dev->rbpl_tail = newtail; - ++moved; - } - - if (moved) - he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail), G0_RBPL_T); -} - -#ifdef USE_RBPS -static void -he_service_rbps(struct he_dev *he_dev, int group) -{ - struct he_rbp *newtail; - struct he_rbp *rbps_head; - int moved = 0; - - rbps_head = (struct he_rbp *) ((unsigned long)he_dev->rbps_base | - RBPS_MASK(he_readl(he_dev, G0_RBPS_S))); - - for (;;) { - newtail = (struct he_rbp *) ((unsigned long)he_dev->rbps_base | - RBPS_MASK(he_dev->rbps_tail+1)); + i = find_next_zero_bit(he_dev->rbpl_table, RBPL_TABLE_SIZE, he_dev->rbpl_hint); + if (i > (RBPL_TABLE_SIZE - 1)) { + i = find_first_zero_bit(he_dev->rbpl_table, RBPL_TABLE_SIZE); + if (i > (RBPL_TABLE_SIZE - 1)) + break; + } + he_dev->rbpl_hint = i + 1; - /* table 3.42 -- rbps_tail should never be set to rbps_head */ - if ((newtail == rbps_head) || (newtail->status & RBP_LOANED)) + heb = pci_pool_alloc(he_dev->rbpl_pool, GFP_ATOMIC|GFP_DMA, &mapping); + if (!heb) break; - - newtail->status |= RBP_LOANED; - he_dev->rbps_tail = newtail; + heb->mapping = mapping; + list_add(&heb->entry, &he_dev->rbpl_outstanding); + he_dev->rbpl_virt[i] = heb; + set_bit(i, he_dev->rbpl_table); + new_tail->idx = i << RBP_IDX_OFFSET; + new_tail->phys = mapping + offsetof(struct he_buff, data); + + he_dev->rbpl_tail = new_tail; ++moved; } if (moved) - he_writel(he_dev, RBPS_MASK(he_dev->rbps_tail), G0_RBPS_T); + he_writel(he_dev, RBPL_MASK(he_dev->rbpl_tail), G0_RBPL_T); } -#endif /* USE_RBPS */ static void he_tasklet(unsigned long data) @@ -2122,9 +1933,7 @@ he_tasklet(unsigned long data) int updated = 0; HPRINTK("tasklet (0x%lx)\n", data); -#ifdef USE_TASKLET spin_lock_irqsave(&he_dev->global_lock, flags); -#endif while (he_dev->irq_head != he_dev->irq_tail) { ++updated; @@ -2137,12 +1946,8 @@ he_tasklet(unsigned long data) HPRINTK("rbrq%d threshold\n", group); /* fall through */ case ITYPE_RBRQ_TIMER: - if (he_service_rbrq(he_dev, group)) { + if (he_service_rbrq(he_dev, group)) he_service_rbpl(he_dev, group); -#ifdef USE_RBPS - he_service_rbps(he_dev, group); -#endif /* USE_RBPS */ - } break; case ITYPE_TBRQ_THRESH: HPRINTK("tbrq%d threshold\n", group); @@ -2154,9 +1959,7 @@ he_tasklet(unsigned long data) he_service_rbpl(he_dev, group); break; case ITYPE_RBPS_THRESH: -#ifdef USE_RBPS - he_service_rbps(he_dev, group); -#endif /* USE_RBPS */ + /* shouldn't happen unless small buffers enabled */ break; case ITYPE_PHY: HPRINTK("phy interrupt\n"); @@ -2184,9 +1987,6 @@ he_tasklet(unsigned long data) he_service_rbrq(he_dev, 0); he_service_rbpl(he_dev, 0); -#ifdef USE_RBPS - he_service_rbps(he_dev, 0); -#endif /* USE_RBPS */ he_service_tbrq(he_dev, 0); break; default: @@ -2208,9 +2008,7 @@ he_tasklet(unsigned long data) IRQ_TAIL(he_dev->irq_tail), IRQ0_HEAD); (void) he_readl(he_dev, INT_FIFO); /* 8.1.2 controller errata; flush posted writes */ } -#ifdef USE_TASKLET spin_unlock_irqrestore(&he_dev->global_lock, flags); -#endif } static irqreturn_t @@ -2242,11 +2040,7 @@ he_irq_handler(int irq, void *dev_id) if (he_dev->irq_head != he_dev->irq_tail) { handled = 1; -#ifdef USE_TASKLET tasklet_schedule(&he_dev->tasklet); -#else - he_tasklet((unsigned long) he_dev); -#endif he_writel(he_dev, INT_CLEAR_A, INT_FIFO); /* clear interrupt */ (void) he_readl(he_dev, INT_FIFO); /* flush posted writes */ } @@ -2303,23 +2097,14 @@ __enqueue_tpd(struct he_dev *he_dev, struct he_tpd *tpd, unsigned cid) dev_kfree_skb_any(tpd->skb); atomic_inc(&tpd->vcc->stats->tx_err); } -#ifdef USE_TPD_POOL pci_pool_free(he_dev->tpd_pool, tpd, TPD_ADDR(tpd->status)); -#else - tpd->inuse = 0; -#endif return; } } /* 2.1.5 transmit packet descriptor ready queue */ -#ifdef USE_TPD_POOL list_add_tail(&tpd->entry, &he_dev->outstanding_tpds); he_dev->tpdrq_tail->tpd = TPD_ADDR(tpd->status); -#else - he_dev->tpdrq_tail->tpd = he_dev->tpd_base_phys + - (TPD_INDEX(tpd->status) * sizeof(struct he_tpd)); -#endif he_dev->tpdrq_tail->cid = cid; wmb(); @@ -2355,7 +2140,7 @@ he_open(struct atm_vcc *vcc) return -ENOMEM; } - he_vcc->iov_tail = he_vcc->iov_head; + INIT_LIST_HEAD(&he_vcc->buffers); he_vcc->pdu_len = 0; he_vcc->rc_index = -1; @@ -2509,13 +2294,8 @@ he_open(struct atm_vcc *vcc) goto open_failed; } -#ifdef USE_RBPS - rsr1 = RSR1_GROUP(0); - rsr4 = RSR4_GROUP(0); -#else /* !USE_RBPS */ - rsr1 = RSR1_GROUP(0)|RSR1_RBPL_ONLY; - rsr4 = RSR4_GROUP(0)|RSR4_RBPL_ONLY; -#endif /* USE_RBPS */ + rsr1 = RSR1_GROUP(0) | RSR1_RBPL_ONLY; + rsr4 = RSR4_GROUP(0) | RSR4_RBPL_ONLY; rsr0 = vcc->qos.rxtp.traffic_class == ATM_UBR ? (RSR0_EPD_ENABLE|RSR0_PPD_ENABLE) : 0; @@ -2614,7 +2394,7 @@ he_close(struct atm_vcc *vcc) * TBRQ, the host issues the close command to the adapter. */ - while (((tx_inuse = atomic_read(&sk_atm(vcc)->sk_wmem_alloc)) > 0) && + while (((tx_inuse = atomic_read(&sk_atm(vcc)->sk_wmem_alloc)) > 1) && (retry < MAX_RETRY)) { msleep(sleep); if (sleep < 250) @@ -2623,7 +2403,7 @@ he_close(struct atm_vcc *vcc) ++retry; } - if (tx_inuse) + if (tx_inuse > 1) hprintk("close tx cid 0x%x tx_inuse = %d\n", cid, tx_inuse); /* 2.3.1.1 generic close operations with flush */ @@ -2772,8 +2552,8 @@ he_send(struct atm_vcc *vcc, struct sk_buff *skb) #ifdef USE_SCATTERGATHER tpd->iovec[slot].addr = pci_map_single(he_dev->pci_dev, skb->data, - skb->len - skb->data_len, PCI_DMA_TODEVICE); - tpd->iovec[slot].len = skb->len - skb->data_len; + skb_headlen(skb), PCI_DMA_TODEVICE); + tpd->iovec[slot].len = skb_headlen(skb); ++slot; for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { @@ -2844,10 +2624,15 @@ he_ioctl(struct atm_dev *atm_dev, unsigned int cmd, void __user *arg) if (copy_from_user(®, arg, sizeof(struct he_ioctl_reg))) return -EFAULT; - + spin_lock_irqsave(&he_dev->global_lock, flags); switch (reg.type) { case HE_REGTYPE_PCI: + if (reg.addr >= HE_REGMAP_SIZE) { + err = -EINVAL; + break; + } + reg.val = he_readl(he_dev, reg.addr); break; case HE_REGTYPE_RCM: @@ -3066,8 +2851,7 @@ module_param(sdh, bool, 0); MODULE_PARM_DESC(sdh, "use SDH framing (default 0)"); static struct pci_device_id he_pci_tbl[] = { - { PCI_VENDOR_ID_FORE, PCI_DEVICE_ID_FORE_HE, PCI_ANY_ID, PCI_ANY_ID, - 0, 0, 0 }, + { PCI_VDEVICE(FORE, PCI_DEVICE_ID_FORE_HE), 0 }, { 0, } }; @@ -3076,19 +2860,8 @@ MODULE_DEVICE_TABLE(pci, he_pci_tbl); static struct pci_driver he_driver = { .name = "he", .probe = he_init_one, - .remove = __devexit_p(he_remove_one), + .remove = he_remove_one, .id_table = he_pci_tbl, }; -static int __init he_init(void) -{ - return pci_register_driver(&he_driver); -} - -static void __exit he_cleanup(void) -{ - pci_unregister_driver(&he_driver); -} - -module_init(he_init); -module_exit(he_cleanup); +module_pci_driver(he_driver); diff --git a/drivers/atm/he.h b/drivers/atm/he.h index 1dc277547a7..110a27d2ecf 100644 --- a/drivers/atm/he.h +++ b/drivers/atm/he.h @@ -1,5 +1,3 @@ -/* $Id: he.h,v 1.4 2003/05/06 22:48:00 chas Exp $ */ - /* he.h @@ -53,8 +51,6 @@ #define CONFIG_IRQ_SIZE 128 #define CONFIG_IRQ_THRESH (CONFIG_IRQ_SIZE/2) -#define CONFIG_NUMTPDS 256 - #define CONFIG_TPDRQ_SIZE 512 #define TPDRQ_MASK(x) (((unsigned long)(x))&((CONFIG_TPDRQ_SIZE<<3)-1)) @@ -71,11 +67,6 @@ #define CONFIG_RBPL_BUFSIZE 4096 #define RBPL_MASK(x) (((unsigned long)(x))&((CONFIG_RBPL_SIZE<<3)-1)) -#define CONFIG_RBPS_SIZE 1024 -#define CONFIG_RBPS_THRESH 64 -#define CONFIG_RBPS_BUFSIZE 128 -#define RBPS_MASK(x) (((unsigned long)(x))&((CONFIG_RBPS_SIZE<<3)-1)) - /* 5.1.3 initialize connection memory */ #define CONFIG_RSRA 0x00000 @@ -142,12 +133,7 @@ struct he_tpd { struct sk_buff *skb; struct atm_vcc *vcc; -#ifdef USE_TPD_POOL struct list_head entry; -#else - u32 inuse; - char padding[32 - sizeof(u32) - (2*sizeof(void*))]; -#endif }; #define TPD_ALIGNMENT 64 @@ -212,36 +198,37 @@ struct he_hsp { } group[HE_NUM_GROUPS]; }; -/* figure 2.9 receive buffer pools */ +/* + * figure 2.9 receive buffer pools + * + * since a virtual address might be more than 32 bits, we store an index + * in the virt member of he_rbp. NOTE: the lower six bits in the rbrq + * addr member are used for buffer status further limiting us to 26 bits. + */ struct he_rbp { volatile u32 phys; - volatile u32 status; + volatile u32 idx; /* virt */ }; -/* NOTE: it is suggested that virt be the virtual address of the host - buffer. on a 64-bit machine, this would not work. Instead, we - store the real virtual address in another list, and store an index - (and buffer status) in the virt member. -*/ +#define RBP_IDX_OFFSET 6 + +/* + * the he dma engine will try to hold an extra 16 buffers in its local + * caches. and add a couple buffers for safety. + */ -#define RBP_INDEX_OFF 6 -#define RBP_INDEX(x) (((long)(x) >> RBP_INDEX_OFF) & 0xffff) -#define RBP_LOANED 0x80000000 -#define RBP_SMALLBUF 0x40000000 +#define RBPL_TABLE_SIZE (CONFIG_RBPL_SIZE + 16 + 2) -struct he_virt { - void *virt; +struct he_buff { + struct list_head entry; + dma_addr_t mapping; + unsigned long len; + u8 data[]; }; -#define RBPL_ALIGNMENT CONFIG_RBPL_SIZE -#define RBPS_ALIGNMENT CONFIG_RBPS_SIZE - #ifdef notyet struct he_group { - u32 rpbs_size, rpbs_qsize; - struct he_rbp rbps_ba; - u32 rpbl_size, rpbl_qsize; struct he_rpb_entry *rbpl_ba; }; @@ -269,13 +256,7 @@ struct he_dev { char prod_id[30]; char mac_addr[6]; - int media; /* - * 0x26 = HE155 MM - * 0x27 = HE622 MM - * 0x46 = HE155 SM - * 0x47 = HE622 SM - */ - + int media; unsigned int vcibits, vpibits; unsigned int cells_per_row; @@ -299,16 +280,9 @@ struct he_dev { volatile unsigned *irq_tailoffset; int irq_peak; -#ifdef USE_TASKLET struct tasklet_struct tasklet; -#endif -#ifdef USE_TPD_POOL struct pci_pool *tpd_pool; struct list_head outstanding_tpds; -#else - struct he_tpd *tpd_head, *tpd_base, *tpd_end; - dma_addr_t tpd_base_phys; -#endif dma_addr_t tpdrq_phys; struct he_tpdrq *tpdrq_base, *tpdrq_tail, *tpdrq_head; @@ -319,30 +293,15 @@ struct he_dev { struct he_rbrq *rbrq_base, *rbrq_head; int rbrq_peak; -#ifdef USE_RBPL_POOL + struct he_buff **rbpl_virt; + unsigned long *rbpl_table; + unsigned long rbpl_hint; struct pci_pool *rbpl_pool; -#else - void *rbpl_pages; - dma_addr_t rbpl_pages_phys; -#endif dma_addr_t rbpl_phys; struct he_rbp *rbpl_base, *rbpl_tail; - struct he_virt *rbpl_virt; + struct list_head rbpl_outstanding; int rbpl_peak; -#ifdef USE_RBPS -#ifdef USE_RBPS_POOL - struct pci_pool *rbps_pool; -#else - void *rbps_pages; - dma_addr_t rbps_pages_phys; -#endif -#endif - dma_addr_t rbps_phys; - struct he_rbp *rbps_base, *rbps_tail; - struct he_virt *rbps_virt; - int rbps_peak; - dma_addr_t tbrq_phys; struct he_tbrq *tbrq_base, *tbrq_head; int tbrq_peak; @@ -355,20 +314,12 @@ struct he_dev { struct he_dev *next; }; -struct he_iovec -{ - u32 iov_base; - u32 iov_len; -}; - #define HE_MAXIOV 20 struct he_vcc { - struct he_iovec iov_head[HE_MAXIOV]; - struct he_iovec *iov_tail; + struct list_head buffers; int pdu_len; - int rc_index; wait_queue_head_t rx_waitq; @@ -394,6 +345,7 @@ struct he_vcc #define HE_DEV(dev) ((struct he_dev *) (dev)->dev_data) #define he_is622(dev) ((dev)->media & 0x1) +#define he_isMM(dev) ((dev)->media & 0x20) #define HE_REGMAP_SIZE 0x100000 @@ -878,8 +830,8 @@ struct he_vcc #define M_SN 0x3a /* integer */ #define MEDIA 0x3e /* integer */ #define HE155MM 0x26 -#define HE155SM 0x27 -#define HE622MM 0x46 +#define HE622MM 0x27 +#define HE155SM 0x46 #define HE622SM 0x47 #define MAC_ADDR 0x42 /* char[] */ diff --git a/drivers/atm/horizon.c b/drivers/atm/horizon.c index 9b2cf253f02..1dc0519333f 100644 --- a/drivers/atm/horizon.c +++ b/drivers/atm/horizon.c @@ -38,12 +38,13 @@ #include <linux/delay.h> #include <linux/uio.h> #include <linux/init.h> +#include <linux/interrupt.h> #include <linux/ioport.h> #include <linux/wait.h> +#include <linux/slab.h> -#include <asm/system.h> #include <asm/io.h> -#include <asm/atomic.h> +#include <linux/atomic.h> #include <asm/uaccess.h> #include <asm/string.h> #include <asm/byteorder.h> @@ -168,13 +169,13 @@ static inline void __init show_version (void) { Real Time (cdv and max CDT given) CBR(pcr) pcr bandwidth always available - rtVBR(pcr,scr,mbs) scr bandwidth always available, upto pcr at mbs too + rtVBR(pcr,scr,mbs) scr bandwidth always available, up to pcr at mbs too Non Real Time - nrtVBR(pcr,scr,mbs) scr bandwidth always available, upto pcr at mbs too + nrtVBR(pcr,scr,mbs) scr bandwidth always available, up to pcr at mbs too UBR() - ABR(mcr,pcr) mcr bandwidth always available, upto pcr (depending) too + ABR(mcr,pcr) mcr bandwidth always available, up to pcr (depending) too mbs is max burst size (bucket) pcr and scr have associated cdvt values @@ -424,7 +425,7 @@ static inline void FLUSH_RX_CHANNEL (hrz_dev * dev, u16 channel) { return; } -static inline void WAIT_FLUSH_RX_COMPLETE (hrz_dev * dev) { +static void WAIT_FLUSH_RX_COMPLETE (hrz_dev * dev) { while (rd_regw (dev, RX_CHANNEL_PORT_OFF) & FLUSH_CHANNEL) ; return; @@ -435,7 +436,7 @@ static inline void SELECT_RX_CHANNEL (hrz_dev * dev, u16 channel) { return; } -static inline void WAIT_UPDATE_COMPLETE (hrz_dev * dev) { +static void WAIT_UPDATE_COMPLETE (hrz_dev * dev) { while (rd_regw (dev, RX_CHANNEL_PORT_OFF) & RX_CHANNEL_UPDATE_IN_PROGRESS) ; return; @@ -635,13 +636,13 @@ static int make_rate (const hrz_dev * dev, u32 c, rounding r, // take care of rounding switch (r) { case round_down: - pre = (br+(c<<div)-1)/(c<<div); + pre = DIV_ROUND_UP(br, c<<div); // but p must be non-zero if (!pre) pre = 1; break; case round_nearest: - pre = (br+(c<<div)/2)/(c<<div); + pre = DIV_ROUND_CLOSEST(br, c<<div); // but p must be non-zero if (!pre) pre = 1; @@ -668,10 +669,10 @@ static int make_rate (const hrz_dev * dev, u32 c, rounding r, // take care of rounding switch (r) { case round_down: - pre = (br+(c<<div)-1)/(c<<div); + pre = DIV_ROUND_UP(br, c<<div); break; case round_nearest: - pre = (br+(c<<div)/2)/(c<<div); + pre = DIV_ROUND_CLOSEST(br, c<<div); break; default: /* round_up */ pre = br/(c<<div); @@ -698,7 +699,7 @@ got_it: if (bits) *bits = (div<<CLOCK_SELECT_SHIFT) | (pre-1); if (actual) { - *actual = (br + (pre<<div) - 1) / (pre<<div); + *actual = DIV_ROUND_UP(br, pre<<div); PRINTD (DBG_QOS, "actual rate: %u", *actual); } return 0; @@ -796,7 +797,7 @@ static void hrz_change_vc_qos (ATM_RXER * rxer, MAAL_QOS * qos) { /********** free an skb (as per ATM device driver documentation) **********/ -static inline void hrz_kfree_skb (struct sk_buff * skb) { +static void hrz_kfree_skb (struct sk_buff * skb) { if (ATM_SKB(skb)->vcc->pop) { ATM_SKB(skb)->vcc->pop (ATM_SKB(skb)->vcc, skb); } else { @@ -943,7 +944,7 @@ static void hrz_close_rx (hrz_dev * dev, u16 vc) { // to be fixed soon, so do not define TAILRECUSRIONWORKS unless you // are sure it does as you may otherwise overflow the kernel stack. -// giving this fn a return value would help GCC, alledgedly +// giving this fn a return value would help GCC, allegedly static void rx_schedule (hrz_dev * dev, int irq) { unsigned int rx_bytes; @@ -1035,7 +1036,7 @@ static void rx_schedule (hrz_dev * dev, int irq) { // VC layer stats atomic_inc(&vcc->stats->rx); __net_timestamp(skb); - // end of our responsability + // end of our responsibility vcc->push (vcc, skb); } } @@ -1076,7 +1077,7 @@ static void rx_schedule (hrz_dev * dev, int irq) { /********** handle RX bus master complete events **********/ -static inline void rx_bus_master_complete_handler (hrz_dev * dev) { +static void rx_bus_master_complete_handler (hrz_dev * dev) { if (test_bit (rx_busy, &dev->flags)) { rx_schedule (dev, 1); } else { @@ -1089,7 +1090,7 @@ static inline void rx_bus_master_complete_handler (hrz_dev * dev) { /********** (queue to) become the next TX thread **********/ -static inline int tx_hold (hrz_dev * dev) { +static int tx_hold (hrz_dev * dev) { PRINTD (DBG_TX, "sleeping at tx lock %p %lu", dev, dev->flags); wait_event_interruptible(dev->tx_queue, (!test_and_set_bit(tx_busy, &dev->flags))); PRINTD (DBG_TX, "woken at tx lock %p %lu", dev, dev->flags); @@ -1232,7 +1233,7 @@ static void tx_schedule (hrz_dev * const dev, int irq) { /********** handle TX bus master complete events **********/ -static inline void tx_bus_master_complete_handler (hrz_dev * dev) { +static void tx_bus_master_complete_handler (hrz_dev * dev) { if (test_bit (tx_busy, &dev->flags)) { tx_schedule (dev, 1); } else { @@ -1246,7 +1247,7 @@ static inline void tx_bus_master_complete_handler (hrz_dev * dev) { /********** move RX Q pointer to next item in circular buffer **********/ // called only from IRQ sub-handler -static inline u32 rx_queue_entry_next (hrz_dev * dev) { +static u32 rx_queue_entry_next (hrz_dev * dev) { u32 rx_queue_entry; spin_lock (&dev->mem_lock); rx_queue_entry = rd_mem (dev, &dev->rx_q_entry->entry); @@ -1270,7 +1271,7 @@ static inline void rx_disabled_handler (hrz_dev * dev) { /********** handle RX data received by device **********/ // called from IRQ handler -static inline void rx_data_av_handler (hrz_dev * dev) { +static void rx_data_av_handler (hrz_dev * dev) { u32 rx_queue_entry; u32 rx_queue_entry_flags; u16 rx_len; @@ -1394,7 +1395,7 @@ static irqreturn_t interrupt_handler(int irq, void *dev_id) irq_ok = 0; while ((int_source = rd_regl (dev, INT_SOURCE_REG_OFF) & INTERESTING_INTERRUPTS)) { - // In the interests of fairness, the (inline) handlers below are + // In the interests of fairness, the handlers below are // called in sequence and without immediate return to the head of // the while loop. This is only of issue for slow hosts (or when // debugging messages are on). Really slow hosts may find a fast @@ -1458,7 +1459,7 @@ static void do_housekeeping (unsigned long arg) { /********** find an idle channel for TX and set it up **********/ // called with tx_busy set -static inline short setup_idle_tx_channel (hrz_dev * dev, hrz_vcc * vcc) { +static short setup_idle_tx_channel (hrz_dev * dev, hrz_vcc * vcc) { unsigned short idle_channels; short tx_channel = -1; unsigned int spin_count; @@ -1644,10 +1645,8 @@ static int hrz_send (struct atm_vcc * atm_vcc, struct sk_buff * skb) { unsigned short d = 0; char * s = skb->data; if (*s++ == 'D') { - for (i = 0; i < 4; ++i) { - d = (d<<4) | ((*s <= '9') ? (*s - '0') : (*s - 'a' + 10)); - ++s; - } + for (i = 0; i < 4; ++i) + d = (d << 4) | hex_to_bin(*s++); PRINTK (KERN_INFO, "debug bitmap is now %hx", debug = d); } } @@ -1777,20 +1776,20 @@ static void hrz_reset (const hrz_dev * dev) { /********** read the burnt in address **********/ -static inline void WRITE_IT_WAIT (const hrz_dev *dev, u32 ctrl) +static void WRITE_IT_WAIT (const hrz_dev *dev, u32 ctrl) { wr_regl (dev, CONTROL_0_REG, ctrl); udelay (5); } -static inline void CLOCK_IT (const hrz_dev *dev, u32 ctrl) +static void CLOCK_IT (const hrz_dev *dev, u32 ctrl) { // DI must be valid around rising SK edge WRITE_IT_WAIT(dev, ctrl & ~SEEPROM_SK); WRITE_IT_WAIT(dev, ctrl | SEEPROM_SK); } -static u16 __devinit read_bia (const hrz_dev * dev, u16 addr) +static u16 read_bia(const hrz_dev *dev, u16 addr) { u32 ctrl = rd_regl (dev, CONTROL_0_REG); @@ -1846,7 +1845,8 @@ static u16 __devinit read_bia (const hrz_dev * dev, u16 addr) /********** initialise a card **********/ -static int __devinit hrz_init (hrz_dev * dev) { +static int hrz_init(hrz_dev *dev) +{ int onefivefive; u16 chan; @@ -1967,7 +1967,7 @@ static int __devinit hrz_init (hrz_dev * dev) { // Set the max AAL5 cell count to be just enough to contain the // largest AAL5 frame that the user wants to receive wr_regw (dev, MAX_AAL5_CELL_COUNT_OFF, - (max_rx_size + ATM_AAL5_TRAILER + ATM_CELL_PAYLOAD - 1) / ATM_CELL_PAYLOAD); + DIV_ROUND_UP(max_rx_size + ATM_AAL5_TRAILER, ATM_CELL_PAYLOAD)); // Enable receive wr_regw (dev, RX_CONFIG_OFF, rd_regw (dev, RX_CONFIG_OFF) | RX_ENABLE); @@ -2183,7 +2183,6 @@ static int hrz_open (struct atm_vcc *atm_vcc) default: PRINTD (DBG_QOS|DBG_VCC, "Bad AAL!"); return -EINVAL; - break; } // TX traffic parameters @@ -2358,7 +2357,6 @@ static int hrz_open (struct atm_vcc *atm_vcc) default: { PRINTD (DBG_QOS, "unsupported TX traffic class"); return -EINVAL; - break; } } } @@ -2434,7 +2432,6 @@ static int hrz_open (struct atm_vcc *atm_vcc) default: { PRINTD (DBG_QOS, "unsupported RX traffic class"); return -EINVAL; - break; } } } @@ -2582,7 +2579,6 @@ static int hrz_getsockopt (struct atm_vcc * atm_vcc, int level, int optname, // break; default: return -ENOPROTOOPT; - break; }; break; } @@ -2590,7 +2586,7 @@ static int hrz_getsockopt (struct atm_vcc * atm_vcc, int level, int optname, } static int hrz_setsockopt (struct atm_vcc * atm_vcc, int level, int optname, - void *optval, int optlen) { + void *optval, unsigned int optlen) { hrz_dev * dev = HRZ_DEV(atm_vcc->dev); PRINTD (DBG_FLOW|DBG_VCC, "hrz_setsockopt"); switch (level) { @@ -2602,7 +2598,6 @@ static int hrz_setsockopt (struct atm_vcc * atm_vcc, int level, int optname, // break; default: return -ENOPROTOOPT; - break; }; break; } @@ -2687,7 +2682,8 @@ static const struct atmdev_ops hrz_ops = { .owner = THIS_MODULE, }; -static int __devinit hrz_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent) +static int hrz_probe(struct pci_dev *pci_dev, + const struct pci_device_id *pci_ent) { hrz_dev * dev; int err = 0; @@ -2705,7 +2701,7 @@ static int __devinit hrz_probe(struct pci_dev *pci_dev, const struct pci_device_ /* XXX DEV_LABEL is a guess */ if (!request_region(iobase, HRZ_IO_EXTENT, DEV_LABEL)) { - return -EINVAL; + err = -EINVAL; goto out_disable; } @@ -2734,7 +2730,8 @@ static int __devinit hrz_probe(struct pci_dev *pci_dev, const struct pci_device_ PRINTD(DBG_INFO, "found Madge ATM adapter (hrz) at: IO %x, IRQ %u, MEM %p", iobase, irq, membase); - dev->atm_dev = atm_dev_register(DEV_LABEL, &hrz_ops, -1, NULL); + dev->atm_dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &hrz_ops, -1, + NULL); if (!(dev->atm_dev)) { PRINTD(DBG_ERR, "failed to register Madge ATM adapter"); err = -EINVAL; @@ -2841,7 +2838,7 @@ out_disable: goto out; } -static void __devexit hrz_remove_one(struct pci_dev *pci_dev) +static void hrz_remove_one(struct pci_dev *pci_dev) { hrz_dev *dev; @@ -2906,7 +2903,7 @@ MODULE_DEVICE_TABLE(pci, hrz_pci_tbl); static struct pci_driver hrz_driver = { .name = "horizon", .probe = hrz_probe, - .remove = __devexit_p(hrz_remove_one), + .remove = hrz_remove_one, .id_table = hrz_pci_tbl, }; diff --git a/drivers/atm/idt77105.c b/drivers/atm/idt77105.c index 84672dc57f7..909c95bd7be 100644 --- a/drivers/atm/idt77105.c +++ b/drivers/atm/idt77105.c @@ -15,7 +15,7 @@ #include <linux/capability.h> #include <linux/atm_idt77105.h> #include <linux/spinlock.h> -#include <asm/system.h> +#include <linux/slab.h> #include <asm/param.h> #include <asm/uaccess.h> @@ -125,7 +125,7 @@ static void idt77105_restart_timer_func(unsigned long dummy) istat = GET(ISTAT); /* side effect: clears all interrupt status bits */ if (istat & IDT77105_ISTAT_GOODSIG) { /* Found signal again */ - dev->signal = ATM_PHY_SIG_FOUND; + atm_dev_signal_change(dev, ATM_PHY_SIG_FOUND); printk(KERN_NOTICE "%s(itf %d): signal detected again\n", dev->type,dev->number); /* flush the receive FIFO */ @@ -150,7 +150,7 @@ static int fetch_stats(struct atm_dev *dev,struct idt77105_stats __user *arg,int spin_unlock_irqrestore(&idt77105_priv_lock, flags); if (arg == NULL) return 0; - return copy_to_user(arg, &PRIV(dev)->stats, + return copy_to_user(arg, &stats, sizeof(struct idt77105_stats)) ? -EFAULT : 0; } @@ -221,7 +221,7 @@ static void idt77105_int(struct atm_dev *dev) /* Rx Signal Condition Change - line went up or down */ if (istat & IDT77105_ISTAT_GOODSIG) { /* signal detected again */ /* This should not happen (restart timer does it) but JIC */ - dev->signal = ATM_PHY_SIG_FOUND; + atm_dev_signal_change(dev, ATM_PHY_SIG_FOUND); } else { /* signal lost */ /* * Disable interrupts and stop all transmission and @@ -234,7 +234,7 @@ static void idt77105_int(struct atm_dev *dev) IDT77105_MCR_DRIC| IDT77105_MCR_HALTTX ) & ~IDT77105_MCR_EIP, MCR); - dev->signal = ATM_PHY_SIG_LOST; + atm_dev_signal_change(dev, ATM_PHY_SIG_LOST); printk(KERN_NOTICE "%s(itf %d): signal lost\n", dev->type,dev->number); } @@ -271,8 +271,9 @@ static int idt77105_start(struct atm_dev *dev) memset(&PRIV(dev)->stats,0,sizeof(struct idt77105_stats)); /* initialise dev->signal from Good Signal Bit */ - dev->signal = GET(ISTAT) & IDT77105_ISTAT_GOODSIG ? ATM_PHY_SIG_FOUND : - ATM_PHY_SIG_LOST; + atm_dev_signal_change(dev, + GET(ISTAT) & IDT77105_ISTAT_GOODSIG ? + ATM_PHY_SIG_FOUND : ATM_PHY_SIG_LOST); if (dev->signal == ATM_PHY_SIG_LOST) printk(KERN_WARNING "%s(itf %d): no signal\n",dev->type, dev->number); @@ -367,9 +368,9 @@ EXPORT_SYMBOL(idt77105_init); static void __exit idt77105_exit(void) { - /* turn off timers */ - del_timer(&stats_timer); - del_timer(&restart_timer); + /* turn off timers */ + del_timer_sync(&stats_timer); + del_timer_sync(&restart_timer); } module_exit(idt77105_exit); diff --git a/drivers/atm/idt77252.c b/drivers/atm/idt77252.c index 28d77b5195d..b621f56a36b 100644 --- a/drivers/atm/idt77252.c +++ b/drivers/atm/idt77252.c @@ -1,8 +1,4 @@ /******************************************************************* - * ident "$Id: idt77252.c,v 1.2 2001/11/11 08:13:54 ecd Exp $" - * - * $Author: ecd $ - * $Date: 2001/11/11 08:13:54 $ * * Copyright (c) 2000 ATecoM GmbH * @@ -29,9 +25,6 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. * *******************************************************************/ -static char const rcsid[] = -"$Id: idt77252.c,v 1.2 2001/11/11 08:13:54 ecd Exp $"; - #include <linux/module.h> #include <linux/pci.h> @@ -44,14 +37,16 @@ static char const rcsid[] = #include <linux/atm.h> #include <linux/delay.h> #include <linux/init.h> +#include <linux/interrupt.h> #include <linux/bitops.h> #include <linux/wait.h> #include <linux/jiffies.h> #include <linux/mutex.h> +#include <linux/slab.h> #include <asm/io.h> #include <asm/uaccess.h> -#include <asm/atomic.h> +#include <linux/atomic.h> #include <asm/byteorder.h> #ifdef CONFIG_ATM_IDT77252_USE_SUNI @@ -1121,11 +1116,8 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe) rpp = &vc->rcv.rx_pool; + __skb_queue_tail(&rpp->queue, skb); rpp->len += skb->len; - if (!rpp->count++) - rpp->first = skb; - *rpp->last = skb; - rpp->last = &skb->next; if (stat & SAR_RSQE_EPDU) { unsigned char *l1l2; @@ -1152,7 +1144,7 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe) atomic_inc(&vcc->stats->rx_err); return; } - if (rpp->count > 1) { + if (skb_queue_len(&rpp->queue) > 1) { struct sk_buff *sb; skb = dev_alloc_skb(rpp->len); @@ -1168,12 +1160,9 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe) dev_kfree_skb(skb); return; } - sb = rpp->first; - for (i = 0; i < rpp->count; i++) { + skb_queue_walk(&rpp->queue, sb) memcpy(skb_put(skb, sb->len), sb->data, sb->len); - sb = sb->next; - } recycle_rx_pool_skb(card, rpp); @@ -1187,7 +1176,6 @@ dequeue_rx(struct idt77252_dev *card, struct rsq_entry *rsqe) return; } - skb->next = NULL; flush_rx_pool(card, rpp); if (!atm_charge(vcc, skb->truesize)) { @@ -1270,18 +1258,17 @@ idt77252_rx_raw(struct idt77252_dev *card) tail = readl(SAR_REG_RAWCT); pci_dma_sync_single_for_cpu(card->pcidev, IDT77252_PRV_PADDR(queue), - skb_end_pointer(queue) - queue->head - 16, + skb_end_offset(queue) - 16, PCI_DMA_FROMDEVICE); while (head != tail) { - unsigned int vpi, vci, pti; + unsigned int vpi, vci; u32 header; header = le32_to_cpu(*(u32 *) &queue->data[0]); vpi = (header & ATM_HDR_VPI_MASK) >> ATM_HDR_VPI_SHIFT; vci = (header & ATM_HDR_VCI_MASK) >> ATM_HDR_VCI_SHIFT; - pti = (header & ATM_HDR_PTI_MASK) >> ATM_HDR_PTI_SHIFT; #ifdef CONFIG_ATM_IDT77252_DEBUG if (debug & DBG_RAW_CELL) { @@ -1925,25 +1912,18 @@ recycle_rx_skb(struct idt77252_dev *card, struct sk_buff *skb) static void flush_rx_pool(struct idt77252_dev *card, struct rx_pool *rpp) { + skb_queue_head_init(&rpp->queue); rpp->len = 0; - rpp->count = 0; - rpp->first = NULL; - rpp->last = &rpp->first; } static void recycle_rx_pool_skb(struct idt77252_dev *card, struct rx_pool *rpp) { - struct sk_buff *skb, *next; - int i; + struct sk_buff *skb, *tmp; - skb = rpp->first; - for (i = 0; i < rpp->count; i++) { - next = skb->next; - skb->next = NULL; + skb_queue_walk_safe(&rpp->queue, skb, tmp) recycle_rx_skb(card, skb); - skb = next; - } + flush_rx_pool(card, rpp); } @@ -2544,7 +2524,7 @@ idt77252_close(struct atm_vcc *vcc) waitfor_idle(card); spin_unlock_irqrestore(&card->cmd_lock, flags); - if (vc->rcv.rx_pool.count) { + if (skb_queue_len(&vc->rcv.rx_pool.queue) != 0) { DPRINTK("%s: closing a VC with pending rx buffers.\n", card->name); @@ -2571,12 +2551,12 @@ done: timeout = 5 * 1000; while (atomic_read(&vc->scq->used) > 0) { timeout = msleep_interruptible(timeout); - if (!timeout) + if (!timeout) { + pr_warn("%s: SCQ drain timeout: %u used\n", + card->name, atomic_read(&vc->scq->used)); break; + } } - if (!timeout) - printk("%s: SCQ drain timeout: %u used\n", - card->name, atomic_read(&vc->scq->used)); writel(TCMDQ_HALT | vc->index, SAR_REG_TCMDQ); clear_scd(card, vc->scq, vc->class); @@ -2729,53 +2709,10 @@ idt77252_proc_read(struct atm_dev *dev, loff_t * pos, char *page) static void idt77252_collect_stat(struct idt77252_dev *card) { - u32 cdc, vpec, icc; - - cdc = readl(SAR_REG_CDC); - vpec = readl(SAR_REG_VPEC); - icc = readl(SAR_REG_ICC); - -#ifdef NOTDEF - printk("%s:", card->name); - - if (cdc & 0x7f0000) { - char *s = ""; - - printk(" ["); - if (cdc & (1 << 22)) { - printk("%sRM ID", s); - s = " | "; - } - if (cdc & (1 << 21)) { - printk("%sCON TAB", s); - s = " | "; - } - if (cdc & (1 << 20)) { - printk("%sNO FB", s); - s = " | "; - } - if (cdc & (1 << 19)) { - printk("%sOAM CRC", s); - s = " | "; - } - if (cdc & (1 << 18)) { - printk("%sRM CRC", s); - s = " | "; - } - if (cdc & (1 << 17)) { - printk("%sRM FIFO", s); - s = " | "; - } - if (cdc & (1 << 16)) { - printk("%sRX FIFO", s); - s = " | "; - } - printk("]"); - } + (void) readl(SAR_REG_CDC); + (void) readl(SAR_REG_VPEC); + (void) readl(SAR_REG_ICC); - printk(" CDC %04x, VPEC %04x, ICC: %04x\n", - cdc & 0xffff, vpec & 0xffff, icc & 0xffff); -#endif } static irqreturn_t @@ -2977,7 +2914,7 @@ close_card_oam(struct idt77252_dev *card) waitfor_idle(card); spin_unlock_irqrestore(&card->cmd_lock, flags); - if (vc->rcv.rx_pool.count) { + if (skb_queue_len(&vc->rcv.rx_pool.queue) != 0) { DPRINTK("%s: closing a VC " "with pending rx buffers.\n", card->name); @@ -3172,8 +3109,7 @@ deinit_card(struct idt77252_dev *card) } -static int __devinit -init_sram(struct idt77252_dev *card) +static void init_sram(struct idt77252_dev *card) { int i; @@ -3318,11 +3254,9 @@ init_sram(struct idt77252_dev *card) SAR_REG_RXFD); IPRINTK("%s: SRAM initialization complete.\n", card->name); - return 0; } -static int __devinit -init_card(struct atm_dev *dev) +static int init_card(struct atm_dev *dev) { struct idt77252_dev *card = dev->dev_data; struct pci_dev *pcidev = card->pcidev; @@ -3384,7 +3318,7 @@ init_card(struct atm_dev *dev) writel(SAR_STAT_TMROF, SAR_REG_STAT); } IPRINTK("%s: Request IRQ ... ", card->name); - if (request_irq(pcidev->irq, idt77252_interrupt, IRQF_DISABLED|IRQF_SHARED, + if (request_irq(pcidev->irq, idt77252_interrupt, IRQF_SHARED, card->name, card) != 0) { printk("%s: can't allocate IRQ.\n", card->name); deinit_card(card); @@ -3430,8 +3364,7 @@ init_card(struct atm_dev *dev) writel(readl(SAR_REG_CFG) | conf, SAR_REG_CFG); - if (init_sram(card) < 0) - return -1; + init_sram(card); /********************************************************************/ /* A L L O C R A M A N D S E T V A R I O U S T H I N G S */ @@ -3481,27 +3414,28 @@ init_card(struct atm_dev *dev) size = sizeof(struct vc_map *) * card->tct_size; IPRINTK("%s: allocate %d byte for VC map.\n", card->name, size); - if (NULL == (card->vcs = vmalloc(size))) { + card->vcs = vzalloc(size); + if (!card->vcs) { printk("%s: memory allocation failure.\n", card->name); deinit_card(card); return -1; } - memset(card->vcs, 0, size); size = sizeof(struct vc_map *) * card->scd_size; IPRINTK("%s: allocate %d byte for SCD to VC mapping.\n", card->name, size); - if (NULL == (card->scd2vc = vmalloc(size))) { + card->scd2vc = vzalloc(size); + if (!card->scd2vc) { printk("%s: memory allocation failure.\n", card->name); deinit_card(card); return -1; } - memset(card->scd2vc, 0, size); size = sizeof(struct tst_info) * (card->tst_size - 2); IPRINTK("%s: allocate %d byte for TST to VC mapping.\n", card->name, size); - if (NULL == (card->soft_tst = vmalloc(size))) { + card->soft_tst = vmalloc(size); + if (!card->soft_tst) { printk("%s: memory allocation failure.\n", card->name); deinit_card(card); return -1; @@ -3517,7 +3451,7 @@ init_card(struct atm_dev *dev) return -1; } if (dev->phy->ioctl == NULL) { - printk("%s: LT had no IOCTL funtion defined.\n", card->name); + printk("%s: LT had no IOCTL function defined.\n", card->name); deinit_card(card); return -1; } @@ -3577,11 +3511,8 @@ init_card(struct atm_dev *dev) tmp = dev_get_by_name(&init_net, tname); /* jhs: was "tmp = dev_get(tname);" */ if (tmp) { memcpy(card->atmdev->esi, tmp->dev_addr, 6); - - printk("%s: ESI %02x:%02x:%02x:%02x:%02x:%02x\n", - card->name, card->atmdev->esi[0], card->atmdev->esi[1], - card->atmdev->esi[2], card->atmdev->esi[3], - card->atmdev->esi[4], card->atmdev->esi[5]); + dev_put(tmp); + printk("%s: ESI %pM\n", card->name, card->atmdev->esi); } /* * XXX: </hack> @@ -3604,8 +3535,7 @@ init_card(struct atm_dev *dev) /*****************************************************************************/ -static int __devinit -idt77252_preset(struct idt77252_dev *card) +static int idt77252_preset(struct idt77252_dev *card) { u16 pci_command; @@ -3646,8 +3576,7 @@ idt77252_preset(struct idt77252_dev *card) } -static unsigned long __devinit -probe_sram(struct idt77252_dev *card) +static unsigned long probe_sram(struct idt77252_dev *card) { u32 data, addr; @@ -3668,8 +3597,8 @@ probe_sram(struct idt77252_dev *card) return addr * sizeof(u32); } -static int __devinit -idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id) +static int idt77252_init_one(struct pci_dev *pcidev, + const struct pci_device_id *id) { static struct idt77252_dev **last = &idt77252_chain; static int index = 0; @@ -3723,7 +3652,8 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id) goto err_out_iounmap; } - dev = atm_dev_register("idt77252", &idt77252_ops, -1, NULL); + dev = atm_dev_register("idt77252", &pcidev->dev, &idt77252_ops, -1, + NULL); if (!dev) { printk("%s: can't register atm device\n", card->name); err = -EIO; @@ -3802,8 +3732,7 @@ err_out_disable_pdev: static struct pci_device_id idt77252_pci_tbl[] = { - { PCI_VENDOR_ID_IDT, PCI_DEVICE_ID_IDT_IDT77252, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { PCI_VDEVICE(IDT, PCI_DEVICE_ID_IDT_IDT77252), 0 }, { 0, } }; diff --git a/drivers/atm/idt77252.h b/drivers/atm/idt77252.h index 6f2b4a5875f..3a82cc23a05 100644 --- a/drivers/atm/idt77252.h +++ b/drivers/atm/idt77252.h @@ -1,8 +1,4 @@ /******************************************************************* - * ident "$Id: idt77252.h,v 1.2 2001/11/11 08:13:54 ecd Exp $" - * - * $Author: ecd $ - * $Date: 2001/11/11 08:13:54 $ * * Copyright (c) 2000 ATecoM GmbH * @@ -177,10 +173,8 @@ struct scq_info }; struct rx_pool { - struct sk_buff *first; - struct sk_buff **last; + struct sk_buff_head queue; unsigned int len; - unsigned int count; }; struct aal1 { @@ -578,7 +572,7 @@ struct idt77252_dev #define SAR_STAT_TSQF 0x00001000 /* Transmit Status Queue full */ #define SAR_STAT_TMROF 0x00000800 /* Timer overflow */ #define SAR_STAT_PHYI 0x00000400 /* PHY device Interrupt flag */ -#define SAR_STAT_CMDBZ 0x00000200 /* ABR SAR Comand Busy Flag */ +#define SAR_STAT_CMDBZ 0x00000200 /* ABR SAR Command Busy Flag */ #define SAR_STAT_FBQ3A 0x00000100 /* Free Buffer Queue 3 Attention */ #define SAR_STAT_FBQ2A 0x00000080 /* Free Buffer Queue 2 Attention */ #define SAR_STAT_RSQF 0x00000040 /* Receive Status Queue full */ @@ -772,7 +766,7 @@ struct idt77252_dev #define SAR_RCTE_BUFFSTAT_MASK 0x00003000 /* buffer status */ #define SAR_RCTE_EFCI 0x00000800 /* EFCI Congestion flag */ #define SAR_RCTE_CLP 0x00000400 /* Cell Loss Priority flag */ -#define SAR_RCTE_CRC 0x00000200 /* Recieved CRC Error */ +#define SAR_RCTE_CRC 0x00000200 /* Received CRC Error */ #define SAR_RCTE_CELLCNT_MASK 0x000001FF /* cell Count */ #define SAR_RCTE_AAL0 0x00000000 /* AAL types for ALL field */ diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c index 670c093ed25..4217f29a85e 100644 --- a/drivers/atm/iphase.c +++ b/drivers/atm/iphase.c @@ -53,23 +53,20 @@ #include <linux/delay.h> #include <linux/uio.h> #include <linux/init.h> +#include <linux/interrupt.h> #include <linux/wait.h> -#include <asm/system.h> +#include <linux/slab.h> #include <asm/io.h> -#include <asm/atomic.h> +#include <linux/atomic.h> #include <asm/uaccess.h> #include <asm/string.h> #include <asm/byteorder.h> -#include <linux/vmalloc.h> +#include <linux/vmalloc.h> +#include <linux/jiffies.h> #include "iphase.h" #include "suni.h" -#define swap(x) (((x & 0xff) << 8) | ((x & 0xff00) >> 8)) -struct suni_priv { - struct k_sonet_stats sonet_stats; /* link diagnostics */ - unsigned char loop_mode; /* loopback mode */ - struct atm_dev *dev; /* device back-pointer */ - struct suni_priv *next; /* next SUNI */ -}; +#define swap_byte_order(x) (((x & 0xff) << 8) | ((x & 0xff00) >> 8)) + #define PRIV(dev) ((struct suni_priv *) dev->phy_data) static unsigned char ia_phy_get(struct atm_dev *dev, unsigned long addr); @@ -93,10 +90,6 @@ module_param(IADebugFlag, uint, 0644); MODULE_LICENSE("GPL"); -#if BITS_PER_LONG != 32 -# error FIXME: this driver only works on 32-bit platforms -#endif - /**************************** IA_LIB **********************************/ static void ia_init_rtn_q (IARTN_Q *que) @@ -164,8 +157,8 @@ static void ia_hack_tcq(IADEV *dev) { } iavcc_r->vc_desc_cnt--; dev->desc_tbl[desc1 -1].timestamp = 0; - IF_EVENT(printk("ia_hack: return_q skb = 0x%x desc = %d\n", - (u32)dev->desc_tbl[desc1 -1].txskb, desc1);) + IF_EVENT(printk("ia_hack: return_q skb = 0x%p desc = %d\n", + dev->desc_tbl[desc1 -1].txskb, desc1);) if (iavcc_r->pcr < dev->rate_limit) { IA_SKB_STATE (dev->desc_tbl[desc1-1].txskb) |= IA_TX_DONE; if (ia_enque_rtn_q(&dev->tx_return_q, dev->desc_tbl[desc1 -1]) < 0) @@ -189,7 +182,7 @@ static u16 get_desc (IADEV *dev, struct ia_vcc *iavcc) { int ltimeout; ia_hack_tcq (dev); - if(((jiffies - timer)>50)||((dev->ffL.tcq_rd==dev->host_tcq_wr))){ + if((time_after(jiffies,timer+50)) || ((dev->ffL.tcq_rd==dev->host_tcq_wr))) { timer = jiffies; i=0; while (i < dev->num_tx_desc) { @@ -227,7 +220,7 @@ static u16 get_desc (IADEV *dev, struct ia_vcc *iavcc) { while (!desc_num || (dev->desc_tbl[desc_num -1]).timestamp) { dev->ffL.tcq_rd += 2; if (dev->ffL.tcq_rd > dev->ffL.tcq_ed) - dev->ffL.tcq_rd = dev->ffL.tcq_st; + dev->ffL.tcq_rd = dev->ffL.tcq_st; if (dev->ffL.tcq_rd == dev->host_tcq_wr) return 0xFFFF; desc_num = *(u_short *)(dev->seg_ram + dev->ffL.tcq_rd); @@ -535,8 +528,8 @@ static int ia_cbr_setup (IADEV *dev, struct atm_vcc *vcc) { inc = 0; testSlot = idealSlot; TstSchedTbl = (u16*)(SchedTbl+testSlot); //set index and read in value - IF_CBR(printk("CBR Testslot 0x%x AT Location 0x%x, NumToAssign=%d\n", - testSlot, (u32)TstSchedTbl,toBeAssigned);) + IF_CBR(printk("CBR Testslot 0x%x AT Location 0x%p, NumToAssign=%d\n", + testSlot, TstSchedTbl,toBeAssigned);) memcpy((caddr_t)&cbrVC,(caddr_t)TstSchedTbl,sizeof(cbrVC)); while (cbrVC) // If another VC at this location, we have to keep looking { @@ -544,8 +537,8 @@ static int ia_cbr_setup (IADEV *dev, struct atm_vcc *vcc) { testSlot = idealSlot - inc; if (testSlot < 0) { // Wrap if necessary testSlot += dev->CbrTotEntries; - IF_CBR(printk("Testslot Wrap. STable Start=0x%x,Testslot=%d\n", - (u32)SchedTbl,testSlot);) + IF_CBR(printk("Testslot Wrap. STable Start=0x%p,Testslot=%d\n", + SchedTbl,testSlot);) } TstSchedTbl = (u16 *)(SchedTbl + testSlot); // set table index memcpy((caddr_t)&cbrVC,(caddr_t)TstSchedTbl,sizeof(cbrVC)); @@ -560,12 +553,12 @@ static int ia_cbr_setup (IADEV *dev, struct atm_vcc *vcc) { } // set table index and read in value TstSchedTbl = (u16*)(SchedTbl + testSlot); - IF_CBR(printk("Reading CBR Tbl from 0x%x, CbrVal=0x%x Iteration %d\n", - (u32)TstSchedTbl,cbrVC,inc);) + IF_CBR(printk("Reading CBR Tbl from 0x%p, CbrVal=0x%x Iteration %d\n", + TstSchedTbl,cbrVC,inc);) memcpy((caddr_t)&cbrVC,(caddr_t)TstSchedTbl,sizeof(cbrVC)); } /* while */ // Move this VCI number into this location of the CBR Sched table. - memcpy((caddr_t)TstSchedTbl, (caddr_t)&vcIndex,sizeof(TstSchedTbl)); + memcpy((caddr_t)TstSchedTbl, (caddr_t)&vcIndex, sizeof(*TstSchedTbl)); dev->CbrRemEntries--; toBeAssigned--; } /* while */ @@ -620,7 +613,6 @@ static int ia_que_tx (IADEV *iadev) { struct sk_buff *skb; int num_desc; struct atm_vcc *vcc; - struct ia_vcc *iavcc; num_desc = ia_avail_descs(iadev); while (num_desc && (skb = skb_dequeue(&iadev->tx_backlog))) { @@ -634,7 +626,6 @@ static int ia_que_tx (IADEV *iadev) { printk("Free the SKB on closed vci %d \n", vcc->vci); break; } - iavcc = INPH_IA_VCC(vcc); if (ia_pkt_tx (vcc, skb)) { skb_queue_head(&iadev->tx_backlog, skb); } @@ -826,129 +817,152 @@ static void ia_hw_type(IADEV *iadev) { } -static void IaFrontEndIntr(IADEV *iadev) { - volatile IA_SUNI *suni; - volatile ia_mb25_t *mb25; - volatile suni_pm7345_t *suni_pm7345; - u32 intr_status; - u_int frmr_intr; - - if(iadev->phy_type & FE_25MBIT_PHY) { - mb25 = (ia_mb25_t*)iadev->phy; - iadev->carrier_detect = Boolean(mb25->mb25_intr_status & MB25_IS_GSB); - } else if (iadev->phy_type & FE_DS3_PHY) { - suni_pm7345 = (suni_pm7345_t *)iadev->phy; - /* clear FRMR interrupts */ - frmr_intr = suni_pm7345->suni_ds3_frm_intr_stat; - iadev->carrier_detect = - Boolean(!(suni_pm7345->suni_ds3_frm_stat & SUNI_DS3_LOSV)); - } else if (iadev->phy_type & FE_E3_PHY ) { - suni_pm7345 = (suni_pm7345_t *)iadev->phy; - frmr_intr = suni_pm7345->suni_e3_frm_maint_intr_ind; - iadev->carrier_detect = - Boolean(!(suni_pm7345->suni_e3_frm_fram_intr_ind_stat&SUNI_E3_LOS)); - } - else { - suni = (IA_SUNI *)iadev->phy; - intr_status = suni->suni_rsop_status & 0xff; - iadev->carrier_detect = Boolean(!(suni->suni_rsop_status & SUNI_LOSV)); - } - if (iadev->carrier_detect) - printk("IA: SUNI carrier detected\n"); - else - printk("IA: SUNI carrier lost signal\n"); - return; +static u32 ia_phy_read32(struct iadev_priv *ia, unsigned int reg) +{ + return readl(ia->phy + (reg >> 2)); +} + +static void ia_phy_write32(struct iadev_priv *ia, unsigned int reg, u32 val) +{ + writel(val, ia->phy + (reg >> 2)); +} + +static void ia_frontend_intr(struct iadev_priv *iadev) +{ + u32 status; + + if (iadev->phy_type & FE_25MBIT_PHY) { + status = ia_phy_read32(iadev, MB25_INTR_STATUS); + iadev->carrier_detect = (status & MB25_IS_GSB) ? 1 : 0; + } else if (iadev->phy_type & FE_DS3_PHY) { + ia_phy_read32(iadev, SUNI_DS3_FRM_INTR_STAT); + status = ia_phy_read32(iadev, SUNI_DS3_FRM_STAT); + iadev->carrier_detect = (status & SUNI_DS3_LOSV) ? 0 : 1; + } else if (iadev->phy_type & FE_E3_PHY) { + ia_phy_read32(iadev, SUNI_E3_FRM_MAINT_INTR_IND); + status = ia_phy_read32(iadev, SUNI_E3_FRM_FRAM_INTR_IND_STAT); + iadev->carrier_detect = (status & SUNI_E3_LOS) ? 0 : 1; + } else { + status = ia_phy_read32(iadev, SUNI_RSOP_STATUS); + iadev->carrier_detect = (status & SUNI_LOSV) ? 0 : 1; + } + + printk(KERN_INFO "IA: SUNI carrier %s\n", + iadev->carrier_detect ? "detected" : "lost signal"); } -static void ia_mb25_init (IADEV *iadev) +static void ia_mb25_init(struct iadev_priv *iadev) { - volatile ia_mb25_t *mb25 = (ia_mb25_t*)iadev->phy; #if 0 mb25->mb25_master_ctrl = MB25_MC_DRIC | MB25_MC_DREC | MB25_MC_ENABLED; #endif - mb25->mb25_master_ctrl = MB25_MC_DRIC | MB25_MC_DREC; - mb25->mb25_diag_control = 0; - /* - * Initialize carrier detect state - */ - iadev->carrier_detect = Boolean(mb25->mb25_intr_status & MB25_IS_GSB); - return; -} + ia_phy_write32(iadev, MB25_MASTER_CTRL, MB25_MC_DRIC | MB25_MC_DREC); + ia_phy_write32(iadev, MB25_DIAG_CONTROL, 0); + + iadev->carrier_detect = + (ia_phy_read32(iadev, MB25_INTR_STATUS) & MB25_IS_GSB) ? 1 : 0; +} -static void ia_suni_pm7345_init (IADEV *iadev) +struct ia_reg { + u16 reg; + u16 val; +}; + +static void ia_phy_write(struct iadev_priv *iadev, + const struct ia_reg *regs, int len) { - volatile suni_pm7345_t *suni_pm7345 = (suni_pm7345_t *)iadev->phy; - if (iadev->phy_type & FE_DS3_PHY) - { - iadev->carrier_detect = - Boolean(!(suni_pm7345->suni_ds3_frm_stat & SUNI_DS3_LOSV)); - suni_pm7345->suni_ds3_frm_intr_enbl = 0x17; - suni_pm7345->suni_ds3_frm_cfg = 1; - suni_pm7345->suni_ds3_tran_cfg = 1; - suni_pm7345->suni_config = 0; - suni_pm7345->suni_splr_cfg = 0; - suni_pm7345->suni_splt_cfg = 0; - } - else - { - iadev->carrier_detect = - Boolean(!(suni_pm7345->suni_e3_frm_fram_intr_ind_stat & SUNI_E3_LOS)); - suni_pm7345->suni_e3_frm_fram_options = 0x4; - suni_pm7345->suni_e3_frm_maint_options = 0x20; - suni_pm7345->suni_e3_frm_fram_intr_enbl = 0x1d; - suni_pm7345->suni_e3_frm_maint_intr_enbl = 0x30; - suni_pm7345->suni_e3_tran_stat_diag_options = 0x0; - suni_pm7345->suni_e3_tran_fram_options = 0x1; - suni_pm7345->suni_config = SUNI_PM7345_E3ENBL; - suni_pm7345->suni_splr_cfg = 0x41; - suni_pm7345->suni_splt_cfg = 0x41; - } - /* - * Enable RSOP loss of signal interrupt. - */ - suni_pm7345->suni_intr_enbl = 0x28; - - /* - * Clear error counters - */ - suni_pm7345->suni_id_reset = 0; - - /* - * Clear "PMCTST" in master test register. - */ - suni_pm7345->suni_master_test = 0; - - suni_pm7345->suni_rxcp_ctrl = 0x2c; - suni_pm7345->suni_rxcp_fctrl = 0x81; - - suni_pm7345->suni_rxcp_idle_pat_h1 = - suni_pm7345->suni_rxcp_idle_pat_h2 = - suni_pm7345->suni_rxcp_idle_pat_h3 = 0; - suni_pm7345->suni_rxcp_idle_pat_h4 = 1; - - suni_pm7345->suni_rxcp_idle_mask_h1 = 0xff; - suni_pm7345->suni_rxcp_idle_mask_h2 = 0xff; - suni_pm7345->suni_rxcp_idle_mask_h3 = 0xff; - suni_pm7345->suni_rxcp_idle_mask_h4 = 0xfe; - - suni_pm7345->suni_rxcp_cell_pat_h1 = - suni_pm7345->suni_rxcp_cell_pat_h2 = - suni_pm7345->suni_rxcp_cell_pat_h3 = 0; - suni_pm7345->suni_rxcp_cell_pat_h4 = 1; - - suni_pm7345->suni_rxcp_cell_mask_h1 = - suni_pm7345->suni_rxcp_cell_mask_h2 = - suni_pm7345->suni_rxcp_cell_mask_h3 = - suni_pm7345->suni_rxcp_cell_mask_h4 = 0xff; - - suni_pm7345->suni_txcp_ctrl = 0xa4; - suni_pm7345->suni_txcp_intr_en_sts = 0x10; - suni_pm7345->suni_txcp_idle_pat_h5 = 0x55; - - suni_pm7345->suni_config &= ~(SUNI_PM7345_LLB | - SUNI_PM7345_CLB | - SUNI_PM7345_DLB | - SUNI_PM7345_PLB); + while (len--) { + ia_phy_write32(iadev, regs->reg, regs->val); + regs++; + } +} + +static void ia_suni_pm7345_init_ds3(struct iadev_priv *iadev) +{ + static const struct ia_reg suni_ds3_init [] = { + { SUNI_DS3_FRM_INTR_ENBL, 0x17 }, + { SUNI_DS3_FRM_CFG, 0x01 }, + { SUNI_DS3_TRAN_CFG, 0x01 }, + { SUNI_CONFIG, 0 }, + { SUNI_SPLR_CFG, 0 }, + { SUNI_SPLT_CFG, 0 } + }; + u32 status; + + status = ia_phy_read32(iadev, SUNI_DS3_FRM_STAT); + iadev->carrier_detect = (status & SUNI_DS3_LOSV) ? 0 : 1; + + ia_phy_write(iadev, suni_ds3_init, ARRAY_SIZE(suni_ds3_init)); +} + +static void ia_suni_pm7345_init_e3(struct iadev_priv *iadev) +{ + static const struct ia_reg suni_e3_init [] = { + { SUNI_E3_FRM_FRAM_OPTIONS, 0x04 }, + { SUNI_E3_FRM_MAINT_OPTIONS, 0x20 }, + { SUNI_E3_FRM_FRAM_INTR_ENBL, 0x1d }, + { SUNI_E3_FRM_MAINT_INTR_ENBL, 0x30 }, + { SUNI_E3_TRAN_STAT_DIAG_OPTIONS, 0 }, + { SUNI_E3_TRAN_FRAM_OPTIONS, 0x01 }, + { SUNI_CONFIG, SUNI_PM7345_E3ENBL }, + { SUNI_SPLR_CFG, 0x41 }, + { SUNI_SPLT_CFG, 0x41 } + }; + u32 status; + + status = ia_phy_read32(iadev, SUNI_E3_FRM_FRAM_INTR_IND_STAT); + iadev->carrier_detect = (status & SUNI_E3_LOS) ? 0 : 1; + ia_phy_write(iadev, suni_e3_init, ARRAY_SIZE(suni_e3_init)); +} + +static void ia_suni_pm7345_init(struct iadev_priv *iadev) +{ + static const struct ia_reg suni_init [] = { + /* Enable RSOP loss of signal interrupt. */ + { SUNI_INTR_ENBL, 0x28 }, + /* Clear error counters. */ + { SUNI_ID_RESET, 0 }, + /* Clear "PMCTST" in master test register. */ + { SUNI_MASTER_TEST, 0 }, + + { SUNI_RXCP_CTRL, 0x2c }, + { SUNI_RXCP_FCTRL, 0x81 }, + + { SUNI_RXCP_IDLE_PAT_H1, 0 }, + { SUNI_RXCP_IDLE_PAT_H2, 0 }, + { SUNI_RXCP_IDLE_PAT_H3, 0 }, + { SUNI_RXCP_IDLE_PAT_H4, 0x01 }, + + { SUNI_RXCP_IDLE_MASK_H1, 0xff }, + { SUNI_RXCP_IDLE_MASK_H2, 0xff }, + { SUNI_RXCP_IDLE_MASK_H3, 0xff }, + { SUNI_RXCP_IDLE_MASK_H4, 0xfe }, + + { SUNI_RXCP_CELL_PAT_H1, 0 }, + { SUNI_RXCP_CELL_PAT_H2, 0 }, + { SUNI_RXCP_CELL_PAT_H3, 0 }, + { SUNI_RXCP_CELL_PAT_H4, 0x01 }, + + { SUNI_RXCP_CELL_MASK_H1, 0xff }, + { SUNI_RXCP_CELL_MASK_H2, 0xff }, + { SUNI_RXCP_CELL_MASK_H3, 0xff }, + { SUNI_RXCP_CELL_MASK_H4, 0xff }, + + { SUNI_TXCP_CTRL, 0xa4 }, + { SUNI_TXCP_INTR_EN_STS, 0x10 }, + { SUNI_TXCP_IDLE_PAT_H5, 0x55 } + }; + + if (iadev->phy_type & FE_DS3_PHY) + ia_suni_pm7345_init_ds3(iadev); + else + ia_suni_pm7345_init_e3(iadev); + + ia_phy_write(iadev, suni_init, ARRAY_SIZE(suni_init)); + + ia_phy_write32(iadev, SUNI_CONFIG, ia_phy_read32(iadev, SUNI_CONFIG) & + ~(SUNI_PM7345_LLB | SUNI_PM7345_CLB | + SUNI_PM7345_DLB | SUNI_PM7345_PLB)); #ifdef __SNMP__ suni_pm7345->suni_rxcp_intr_en_sts |= SUNI_OOCDE; #endif /* __SNMP__ */ @@ -985,9 +999,7 @@ static void xdump( u_char* cp, int length, char* prefix ) else pBuf += sprintf( pBuf, "." ); } - sprintf( pBuf, "\n" ); - // SPrint(prntBuf); - printk(prntBuf); + printk("%s\n", prntBuf); count += col; pBuf = prntBuf; } @@ -1034,7 +1046,7 @@ static void desc_dbg(IADEV *iadev) { } -/*----------------------------- Recieving side stuff --------------------------*/ +/*----------------------------- Receiving side stuff --------------------------*/ static void rx_excp_rcvd(struct atm_dev *dev) { @@ -1142,7 +1154,7 @@ static int rx_pkt(struct atm_dev *dev) IF_ERR(printk(" cause: packet time out\n");) } else { - IF_ERR(printk(" cause: buffer over flow\n");) + IF_ERR(printk(" cause: buffer overflow\n");) } goto out_free_desc; } @@ -1204,7 +1216,7 @@ static void rx_intr(struct atm_dev *dev) if (status & RX_PKT_RCVD) { /* do something */ - /* Basically recvd an interrupt for receving a packet. + /* Basically recvd an interrupt for receiving a packet. A descriptor would have been written to the packet complete queue. Get all the descriptors and set up dma to move the packets till the packet complete queue is empty.. @@ -1225,7 +1237,7 @@ static void rx_intr(struct atm_dev *dev) iadev->rx_tmp_jif = jiffies; iadev->rxing = 0; } - else if (((jiffies - iadev->rx_tmp_jif) > 50) && + else if ((time_after(jiffies, iadev->rx_tmp_jif + 50)) && ((iadev->rx_pkt_cnt - iadev->rx_tmp_cnt) == 0)) { for (i = 1; i <= iadev->num_rx_desc; i++) free_desc(dev, i); @@ -1307,22 +1319,22 @@ static void rx_dle_intr(struct atm_dev *dev) if (ia_vcc == NULL) { atomic_inc(&vcc->stats->rx_err); + atm_return(vcc, skb->truesize); dev_kfree_skb_any(skb); - atm_return(vcc, atm_guess_pdu2truesize(len)); goto INCR_DLE; } // get real pkt length pwang_test trailer = (struct cpcs_trailer*)((u_char *)skb->data + skb->len - sizeof(*trailer)); - length = swap(trailer->length); + length = swap_byte_order(trailer->length); if ((length > iadev->rx_buf_sz) || (length > (skb->len - sizeof(struct cpcs_trailer)))) { atomic_inc(&vcc->stats->rx_err); IF_ERR(printk("rx_dle_intr: Bad AAL5 trailer %d (skb len %d)", length, skb->len);) + atm_return(vcc, skb->truesize); dev_kfree_skb_any(skb); - atm_return(vcc, atm_guess_pdu2truesize(len)); goto INCR_DLE; } skb_trim(skb, length); @@ -1410,7 +1422,6 @@ static int rx_init(struct atm_dev *dev) struct abr_vc_table *abr_vc_table; u16 *vc_table; u16 *reass_table; - u16 *ptr16; int i,j, vcsize_sel; u_short freeq_st_adr; u_short *freeq_start; @@ -1425,22 +1436,23 @@ static int rx_init(struct atm_dev *dev) printk(KERN_ERR DEV_LABEL "can't allocate DLEs\n"); goto err_out; } - iadev->rx_dle_q.start = (struct dle*)dle_addr; + iadev->rx_dle_q.start = (struct dle *)dle_addr; iadev->rx_dle_q.read = iadev->rx_dle_q.start; iadev->rx_dle_q.write = iadev->rx_dle_q.start; - iadev->rx_dle_q.end = (struct dle*)((u32)dle_addr+sizeof(struct dle)*DLE_ENTRIES); + iadev->rx_dle_q.end = (struct dle*)((unsigned long)dle_addr+sizeof(struct dle)*DLE_ENTRIES); /* the end of the dle q points to the entry after the last DLE that can be used. */ /* write the upper 20 bits of the start address to rx list address register */ + /* We know this is 32bit bus addressed so the following is safe */ writel(iadev->rx_dle_dma & 0xfffff000, iadev->dma + IPHASE5575_RX_LIST_ADDR); - IF_INIT(printk("Tx Dle list addr: 0x%08x value: 0x%0x\n", - (u32)(iadev->dma+IPHASE5575_TX_LIST_ADDR), - *(u32*)(iadev->dma+IPHASE5575_TX_LIST_ADDR)); - printk("Rx Dle list addr: 0x%08x value: 0x%0x\n", - (u32)(iadev->dma+IPHASE5575_RX_LIST_ADDR), - *(u32*)(iadev->dma+IPHASE5575_RX_LIST_ADDR));) + IF_INIT(printk("Tx Dle list addr: 0x%p value: 0x%0x\n", + iadev->dma+IPHASE5575_TX_LIST_ADDR, + readl(iadev->dma + IPHASE5575_TX_LIST_ADDR)); + printk("Rx Dle list addr: 0x%p value: 0x%0x\n", + iadev->dma+IPHASE5575_RX_LIST_ADDR, + readl(iadev->dma + IPHASE5575_RX_LIST_ADDR));) writew(0xffff, iadev->reass_reg+REASS_MASK_REG); writew(0, iadev->reass_reg+MODE_REG); @@ -1478,7 +1490,7 @@ static int rx_init(struct atm_dev *dev) buf_desc_ptr++; rx_pkt_start += iadev->rx_buf_sz; } - IF_INIT(printk("Rx Buffer desc ptr: 0x%0x\n", (u32)(buf_desc_ptr));) + IF_INIT(printk("Rx Buffer desc ptr: 0x%p\n", buf_desc_ptr);) i = FREE_BUF_DESC_Q*iadev->memSize; writew(i >> 16, iadev->reass_reg+REASS_QUEUE_BASE); writew(i, iadev->reass_reg+FREEQ_ST_ADR); @@ -1495,7 +1507,7 @@ static int rx_init(struct atm_dev *dev) *freeq_start = (u_short)i; freeq_start++; } - IF_INIT(printk("freeq_start: 0x%0x\n", (u32)freeq_start);) + IF_INIT(printk("freeq_start: 0x%p\n", freeq_start);) /* Packet Complete Queue */ i = (PKT_COMP_Q * iadev->memSize) & 0xffff; writew(i, iadev->reass_reg+PCQ_ST_ADR); @@ -1586,11 +1598,12 @@ static int rx_init(struct atm_dev *dev) Set Packet Aging Interval count register to overflow in about 4 us */ writew(0xF6F8, iadev->reass_reg+PKT_TM_CNT ); - ptr16 = (u16*)j; - i = ((u32)ptr16 >> 6) & 0xff; - ptr16 += j - 1; - i |=(((u32)ptr16 << 2) & 0xff00); + + i = (j >> 6) & 0xFF; + j += 2 * (j - 1); + i |= ((j << 2) & 0xFF00); writew(i, iadev->reass_reg+TMOUT_RANGE); + /* initiate the desc_tble */ for(i=0; i<iadev->num_tx_desc;i++) iadev->desc_tbl[i].timestamp = 0; @@ -1720,7 +1733,7 @@ static void tx_dle_intr(struct atm_dev *dev) IA_SKB_STATE(skb) |= IA_DLED; skb_queue_tail(&iavcc->txing_skb, skb); } - IF_EVENT(printk("tx_dle_intr: enque skb = 0x%x \n", (u32)skb);) + IF_EVENT(printk("tx_dle_intr: enque skb = 0x%p \n", skb);) if (++dle == iadev->tx_dle_q.end) dle = iadev->tx_dle_q.start; } @@ -1863,7 +1876,7 @@ static int open_tx(struct atm_vcc *vcc) return -EINVAL; } if (vcc->qos.txtp.max_pcr > iadev->LineRate) { - IF_CBR(printk("PCR is not availble\n");) + IF_CBR(printk("PCR is not available\n");) return -1; } vc->type = CBR; @@ -1913,7 +1926,7 @@ static int tx_init(struct atm_dev *dev) iadev->tx_dle_q.start = (struct dle*)dle_addr; iadev->tx_dle_q.read = iadev->tx_dle_q.start; iadev->tx_dle_q.write = iadev->tx_dle_q.start; - iadev->tx_dle_q.end = (struct dle*)((u32)dle_addr+sizeof(struct dle)*DLE_ENTRIES); + iadev->tx_dle_q.end = (struct dle*)((unsigned long)dle_addr+sizeof(struct dle)*DLE_ENTRIES); /* write the upper 20 bits of the start address to tx list address register */ writel(iadev->tx_dle_dma & 0xfffff000, @@ -2051,8 +2064,8 @@ static int tx_init(struct atm_dev *dev) writew(tmp16, iadev->seg_reg+CBR_TAB_END+1); // CBR_PTR; tmp16 = (CBR_SCHED_TABLE*iadev->memSize + iadev->num_vc*6 - 2) >> 1; writew(tmp16, iadev->seg_reg+CBR_TAB_END); - IF_INIT(printk("iadev->seg_reg = 0x%x CBR_PTR_BASE = 0x%x\n", - (u32)iadev->seg_reg, readw(iadev->seg_reg+CBR_PTR_BASE));) + IF_INIT(printk("iadev->seg_reg = 0x%p CBR_PTR_BASE = 0x%x\n", + iadev->seg_reg, readw(iadev->seg_reg+CBR_PTR_BASE));) IF_INIT(printk("CBR_TAB_BEG = 0x%x, CBR_TAB_END = 0x%x, CBR_PTR = 0x%x\n", readw(iadev->seg_reg+CBR_TAB_BEG), readw(iadev->seg_reg+CBR_TAB_END), readw(iadev->seg_reg+CBR_TAB_END+1));) @@ -2071,7 +2084,7 @@ static int tx_init(struct atm_dev *dev) - UBR Table size is 4K - UBR wait queue is 4K since the table and wait queues are contiguous, all the bytes - can be initialized by one memeset. + can be initialized by one memeset. */ vcsize_sel = 0; @@ -2097,7 +2110,7 @@ static int tx_init(struct atm_dev *dev) - ABR Table size is 2K - ABR wait queue is 2K since the table and wait queues are contiguous, all the bytes - can be intialized by one memeset. + can be initialized by one memeset. */ i = ABR_SCHED_TABLE * iadev->memSize; writew((i >> 11) & 0xffff, iadev->seg_reg+ABR_SBPTR_BASE); @@ -2219,7 +2232,7 @@ static irqreturn_t ia_int(int irq, void *dev_id) if (status & STAT_DLERINT) { /* Clear this bit by writing a 1 to it. */ - *(u_int *)(iadev->reg+IPHASE5575_BUS_STATUS_REG) = STAT_DLERINT; + writel(STAT_DLERINT, iadev->reg + IPHASE5575_BUS_STATUS_REG); rx_dle_intr(dev); } if (status & STAT_SEGINT) @@ -2230,13 +2243,13 @@ static irqreturn_t ia_int(int irq, void *dev_id) } if (status & STAT_DLETINT) { - *(u_int *)(iadev->reg+IPHASE5575_BUS_STATUS_REG) = STAT_DLETINT; + writel(STAT_DLETINT, iadev->reg + IPHASE5575_BUS_STATUS_REG); tx_dle_intr(dev); } if (status & (STAT_FEINT | STAT_ERRINT | STAT_MARKINT)) { if (status & STAT_FEINT) - IaFrontEndIntr(iadev); + ia_frontend_intr(iadev); } } return IRQ_RETVAL(handled); @@ -2286,7 +2299,7 @@ static int reset_sar(struct atm_dev *dev) } -static int __devinit ia_init(struct atm_dev *dev) +static int ia_init(struct atm_dev *dev) { IADEV *iadev; unsigned long real_base; @@ -2349,7 +2362,7 @@ static int __devinit ia_init(struct atm_dev *dev) { printk(DEV_LABEL " (itf %d): can't set up page mapping\n", dev->number); - return error; + return -ENOMEM; } IF_INIT(printk(DEV_LABEL " (itf %d): rev.%d,base=%p,irq=%d\n", dev->number, iadev->pci->revision, base, iadev->irq);) @@ -2479,7 +2492,7 @@ static void ia_free_rx(IADEV *iadev) iadev->rx_dle_dma); } -static int __devinit ia_start(struct atm_dev *dev) +static int ia_start(struct atm_dev *dev) { IADEV *iadev; int error; @@ -2561,19 +2574,13 @@ static int __devinit ia_start(struct atm_dev *dev) error = suni_init(dev); if (error) goto err_free_rx; - /* - * Enable interrupt on loss of signal - * SUNI_RSOP_CIE - 0x10 - * SUNI_RSOP_CIE_LOSE - 0x04 - */ - ia_phy_put(dev, ia_phy_get(dev, 0x10) | 0x04, 0x10); -#ifndef MODULE - error = dev->phy->start(dev); - if (error) - goto err_free_rx; -#endif + if (dev->phy->start) { + error = dev->phy->start(dev); + if (error) + goto err_free_rx; + } /* Get iadev->carrier_detect status */ - IaFrontEndIntr(iadev); + ia_frontend_intr(iadev); } return 0; @@ -2674,7 +2681,6 @@ static void ia_close(struct atm_vcc *vcc) static int ia_open(struct atm_vcc *vcc) { - IADEV *iadev; struct ia_vcc *ia_vcc; int error; if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) @@ -2682,7 +2688,6 @@ static int ia_open(struct atm_vcc *vcc) IF_EVENT(printk("ia: not partially allocated resources\n");) vcc->dev_data = NULL; } - iadev = INPH_IA_DEV(vcc->dev); if (vcc->vci != ATM_VPI_UNSPEC && vcc->vpi != ATM_VCI_UNSPEC) { IF_EVENT(printk("iphase open: unspec part\n");) @@ -2846,7 +2851,7 @@ static int ia_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg) case 0xb: if (!capable(CAP_NET_ADMIN)) return -EPERM; - IaFrontEndIntr(iadev); + ia_frontend_intr(iadev); break; case 0xa: if (!capable(CAP_NET_ADMIN)) return -EPERM; @@ -2877,7 +2882,7 @@ static int ia_getsockopt(struct atm_vcc *vcc, int level, int optname, } static int ia_setsockopt(struct atm_vcc *vcc, int level, int optname, - void __user *optval, int optlen) + void __user *optval, unsigned int optlen) { IF_EVENT(printk(">ia_setsockopt\n");) return -EINVAL; @@ -2912,7 +2917,7 @@ static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb) { dev_kfree_skb_any(skb); return 0; } - if ((u32)skb->data & 3) { + if ((unsigned long)skb->data & 3) { printk("Misaligned SKB\n"); if (vcc->pop) vcc->pop(vcc, skb); @@ -2976,8 +2981,8 @@ static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb) { /* Put the packet in a tx buffer */ trailer = iadev->tx_buf[desc-1].cpcs; - IF_TX(printk("Sent: skb = 0x%x skb->data: 0x%x len: %d, desc: %d\n", - (u32)skb, (u32)skb->data, skb->len, desc);) + IF_TX(printk("Sent: skb = 0x%p skb->data: 0x%p len: %d, desc: %d\n", + skb, skb->data, skb->len, desc);) trailer->control = 0; /*big endian*/ trailer->length = ((skb->len & 0xff) << 8) | ((skb->len & 0xff00) >> 8); @@ -3008,7 +3013,7 @@ static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb) { skb->len, PCI_DMA_TODEVICE); wr_ptr->local_pkt_addr = (buf_desc_ptr->buf_start_hi << 16) | buf_desc_ptr->buf_start_lo; - /* wr_ptr->bytes = swap(total_len); didn't seem to affect ?? */ + /* wr_ptr->bytes = swap_byte_order(total_len); didn't seem to affect?? */ wr_ptr->bytes = skb->len; /* hw bug - DLEs of 0x2d, 0x2e, 0x2f cause DMA lockup */ @@ -3066,11 +3071,9 @@ static int ia_pkt_tx (struct atm_vcc *vcc, struct sk_buff *skb) { static int ia_send(struct atm_vcc *vcc, struct sk_buff *skb) { IADEV *iadev; - struct ia_vcc *iavcc; unsigned long flags; iadev = INPH_IA_DEV(vcc->dev); - iavcc = INPH_IA_VCC(vcc); if ((!skb)||(skb->len>(iadev->tx_buf_sz-sizeof(struct cpcs_trailer)))) { if (!skb) @@ -3165,12 +3168,10 @@ static const struct atmdev_ops ops = { .owner = THIS_MODULE, }; -static int __devinit ia_init_one(struct pci_dev *pdev, - const struct pci_device_id *ent) +static int ia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { struct atm_dev *dev; IADEV *iadev; - unsigned long flags; int ret; iadev = kzalloc(sizeof(*iadev), GFP_KERNEL); @@ -3187,39 +3188,34 @@ static int __devinit ia_init_one(struct pci_dev *pdev, ret = -ENODEV; goto err_out_free_iadev; } - dev = atm_dev_register(DEV_LABEL, &ops, -1, NULL); + dev = atm_dev_register(DEV_LABEL, &pdev->dev, &ops, -1, NULL); if (!dev) { ret = -ENOMEM; goto err_out_disable_dev; } dev->dev_data = iadev; IF_INIT(printk(DEV_LABEL "registered at (itf :%d)\n", dev->number);) - IF_INIT(printk("dev_id = 0x%x iadev->LineRate = %d \n", (u32)dev, + IF_INIT(printk("dev_id = 0x%p iadev->LineRate = %d \n", dev, iadev->LineRate);) + pci_set_drvdata(pdev, dev); + ia_dev[iadev_count] = iadev; _ia_dev[iadev_count] = dev; iadev_count++; - spin_lock_init(&iadev->misc_lock); - /* First fixes first. I don't want to think about this now. */ - spin_lock_irqsave(&iadev->misc_lock, flags); if (ia_init(dev) || ia_start(dev)) { IF_INIT(printk("IA register failed!\n");) iadev_count--; ia_dev[iadev_count] = NULL; _ia_dev[iadev_count] = NULL; - spin_unlock_irqrestore(&iadev->misc_lock, flags); ret = -EINVAL; goto err_out_deregister_dev; } - spin_unlock_irqrestore(&iadev->misc_lock, flags); IF_EVENT(printk("iadev_count = %d\n", iadev_count);) iadev->next_board = ia_boards; ia_boards = dev; - pci_set_drvdata(pdev, dev); - return 0; err_out_deregister_dev: @@ -3232,14 +3228,19 @@ err_out: return ret; } -static void __devexit ia_remove_one(struct pci_dev *pdev) +static void ia_remove_one(struct pci_dev *pdev) { struct atm_dev *dev = pci_get_drvdata(pdev); IADEV *iadev = INPH_IA_DEV(dev); - ia_phy_put(dev, ia_phy_get(dev,0x10) & ~(0x4), 0x10); + /* Disable phy interrupts */ + ia_phy_put(dev, ia_phy_get(dev, SUNI_RSOP_CIE) & ~(SUNI_RSOP_CIE_LOSE), + SUNI_RSOP_CIE); udelay(1); + if (dev->phy && dev->phy->stop) + dev->phy->stop(dev); + /* De-register device */ free_irq(iadev->irq, dev); iadev_count--; @@ -3268,7 +3269,7 @@ static struct pci_driver ia_driver = { .name = DEV_LABEL, .id_table = ia_pci_tbl, .probe = ia_init_one, - .remove = __devexit_p(ia_remove_one), + .remove = ia_remove_one, }; static int __init ia_module_init(void) diff --git a/drivers/atm/iphase.h b/drivers/atm/iphase.h index 133eefcc047..53ecac5a216 100644 --- a/drivers/atm/iphase.h +++ b/drivers/atm/iphase.h @@ -636,82 +636,82 @@ struct rx_buf_desc { #define SEG_BASE IPHASE5575_FRAG_CONTROL_REG_BASE #define REASS_BASE IPHASE5575_REASS_CONTROL_REG_BASE -typedef volatile u_int freg_t; +typedef volatile u_int ffreg_t; typedef u_int rreg_t; typedef struct _ffredn_t { - freg_t idlehead_high; /* Idle cell header (high) */ - freg_t idlehead_low; /* Idle cell header (low) */ - freg_t maxrate; /* Maximum rate */ - freg_t stparms; /* Traffic Management Parameters */ - freg_t abrubr_abr; /* ABRUBR Priority Byte 1, TCR Byte 0 */ - freg_t rm_type; /* */ - u_int filler5[0x17 - 0x06]; - freg_t cmd_reg; /* Command register */ - u_int filler18[0x20 - 0x18]; - freg_t cbr_base; /* CBR Pointer Base */ - freg_t vbr_base; /* VBR Pointer Base */ - freg_t abr_base; /* ABR Pointer Base */ - freg_t ubr_base; /* UBR Pointer Base */ - u_int filler24; - freg_t vbrwq_base; /* VBR Wait Queue Base */ - freg_t abrwq_base; /* ABR Wait Queue Base */ - freg_t ubrwq_base; /* UBR Wait Queue Base */ - freg_t vct_base; /* Main VC Table Base */ - freg_t vcte_base; /* Extended Main VC Table Base */ - u_int filler2a[0x2C - 0x2A]; - freg_t cbr_tab_beg; /* CBR Table Begin */ - freg_t cbr_tab_end; /* CBR Table End */ - freg_t cbr_pointer; /* CBR Pointer */ - u_int filler2f[0x30 - 0x2F]; - freg_t prq_st_adr; /* Packet Ready Queue Start Address */ - freg_t prq_ed_adr; /* Packet Ready Queue End Address */ - freg_t prq_rd_ptr; /* Packet Ready Queue read pointer */ - freg_t prq_wr_ptr; /* Packet Ready Queue write pointer */ - freg_t tcq_st_adr; /* Transmit Complete Queue Start Address*/ - freg_t tcq_ed_adr; /* Transmit Complete Queue End Address */ - freg_t tcq_rd_ptr; /* Transmit Complete Queue read pointer */ - freg_t tcq_wr_ptr; /* Transmit Complete Queue write pointer*/ - u_int filler38[0x40 - 0x38]; - freg_t queue_base; /* Base address for PRQ and TCQ */ - freg_t desc_base; /* Base address of descriptor table */ - u_int filler42[0x45 - 0x42]; - freg_t mode_reg_0; /* Mode register 0 */ - freg_t mode_reg_1; /* Mode register 1 */ - freg_t intr_status_reg;/* Interrupt Status register */ - freg_t mask_reg; /* Mask Register */ - freg_t cell_ctr_high1; /* Total cell transfer count (high) */ - freg_t cell_ctr_lo1; /* Total cell transfer count (low) */ - freg_t state_reg; /* Status register */ - u_int filler4c[0x58 - 0x4c]; - freg_t curr_desc_num; /* Contains the current descriptor num */ - freg_t next_desc; /* Next descriptor */ - freg_t next_vc; /* Next VC */ - u_int filler5b[0x5d - 0x5b]; - freg_t present_slot_cnt;/* Present slot count */ - u_int filler5e[0x6a - 0x5e]; - freg_t new_desc_num; /* New descriptor number */ - freg_t new_vc; /* New VC */ - freg_t sched_tbl_ptr; /* Schedule table pointer */ - freg_t vbrwq_wptr; /* VBR wait queue write pointer */ - freg_t vbrwq_rptr; /* VBR wait queue read pointer */ - freg_t abrwq_wptr; /* ABR wait queue write pointer */ - freg_t abrwq_rptr; /* ABR wait queue read pointer */ - freg_t ubrwq_wptr; /* UBR wait queue write pointer */ - freg_t ubrwq_rptr; /* UBR wait queue read pointer */ - freg_t cbr_vc; /* CBR VC */ - freg_t vbr_sb_vc; /* VBR SB VC */ - freg_t abr_sb_vc; /* ABR SB VC */ - freg_t ubr_sb_vc; /* UBR SB VC */ - freg_t vbr_next_link; /* VBR next link */ - freg_t abr_next_link; /* ABR next link */ - freg_t ubr_next_link; /* UBR next link */ - u_int filler7a[0x7c-0x7a]; - freg_t out_rate_head; /* Out of rate head */ - u_int filler7d[0xca-0x7d]; /* pad out to full address space */ - freg_t cell_ctr_high1_nc;/* Total cell transfer count (high) */ - freg_t cell_ctr_lo1_nc;/* Total cell transfer count (low) */ - u_int fillercc[0x100-0xcc]; /* pad out to full address space */ + ffreg_t idlehead_high; /* Idle cell header (high) */ + ffreg_t idlehead_low; /* Idle cell header (low) */ + ffreg_t maxrate; /* Maximum rate */ + ffreg_t stparms; /* Traffic Management Parameters */ + ffreg_t abrubr_abr; /* ABRUBR Priority Byte 1, TCR Byte 0 */ + ffreg_t rm_type; /* */ + u_int filler5[0x17 - 0x06]; + ffreg_t cmd_reg; /* Command register */ + u_int filler18[0x20 - 0x18]; + ffreg_t cbr_base; /* CBR Pointer Base */ + ffreg_t vbr_base; /* VBR Pointer Base */ + ffreg_t abr_base; /* ABR Pointer Base */ + ffreg_t ubr_base; /* UBR Pointer Base */ + u_int filler24; + ffreg_t vbrwq_base; /* VBR Wait Queue Base */ + ffreg_t abrwq_base; /* ABR Wait Queue Base */ + ffreg_t ubrwq_base; /* UBR Wait Queue Base */ + ffreg_t vct_base; /* Main VC Table Base */ + ffreg_t vcte_base; /* Extended Main VC Table Base */ + u_int filler2a[0x2C - 0x2A]; + ffreg_t cbr_tab_beg; /* CBR Table Begin */ + ffreg_t cbr_tab_end; /* CBR Table End */ + ffreg_t cbr_pointer; /* CBR Pointer */ + u_int filler2f[0x30 - 0x2F]; + ffreg_t prq_st_adr; /* Packet Ready Queue Start Address */ + ffreg_t prq_ed_adr; /* Packet Ready Queue End Address */ + ffreg_t prq_rd_ptr; /* Packet Ready Queue read pointer */ + ffreg_t prq_wr_ptr; /* Packet Ready Queue write pointer */ + ffreg_t tcq_st_adr; /* Transmit Complete Queue Start Address*/ + ffreg_t tcq_ed_adr; /* Transmit Complete Queue End Address */ + ffreg_t tcq_rd_ptr; /* Transmit Complete Queue read pointer */ + ffreg_t tcq_wr_ptr; /* Transmit Complete Queue write pointer*/ + u_int filler38[0x40 - 0x38]; + ffreg_t queue_base; /* Base address for PRQ and TCQ */ + ffreg_t desc_base; /* Base address of descriptor table */ + u_int filler42[0x45 - 0x42]; + ffreg_t mode_reg_0; /* Mode register 0 */ + ffreg_t mode_reg_1; /* Mode register 1 */ + ffreg_t intr_status_reg;/* Interrupt Status register */ + ffreg_t mask_reg; /* Mask Register */ + ffreg_t cell_ctr_high1; /* Total cell transfer count (high) */ + ffreg_t cell_ctr_lo1; /* Total cell transfer count (low) */ + ffreg_t state_reg; /* Status register */ + u_int filler4c[0x58 - 0x4c]; + ffreg_t curr_desc_num; /* Contains the current descriptor num */ + ffreg_t next_desc; /* Next descriptor */ + ffreg_t next_vc; /* Next VC */ + u_int filler5b[0x5d - 0x5b]; + ffreg_t present_slot_cnt;/* Present slot count */ + u_int filler5e[0x6a - 0x5e]; + ffreg_t new_desc_num; /* New descriptor number */ + ffreg_t new_vc; /* New VC */ + ffreg_t sched_tbl_ptr; /* Schedule table pointer */ + ffreg_t vbrwq_wptr; /* VBR wait queue write pointer */ + ffreg_t vbrwq_rptr; /* VBR wait queue read pointer */ + ffreg_t abrwq_wptr; /* ABR wait queue write pointer */ + ffreg_t abrwq_rptr; /* ABR wait queue read pointer */ + ffreg_t ubrwq_wptr; /* UBR wait queue write pointer */ + ffreg_t ubrwq_rptr; /* UBR wait queue read pointer */ + ffreg_t cbr_vc; /* CBR VC */ + ffreg_t vbr_sb_vc; /* VBR SB VC */ + ffreg_t abr_sb_vc; /* ABR SB VC */ + ffreg_t ubr_sb_vc; /* UBR SB VC */ + ffreg_t vbr_next_link; /* VBR next link */ + ffreg_t abr_next_link; /* ABR next link */ + ffreg_t ubr_next_link; /* UBR next link */ + u_int filler7a[0x7c-0x7a]; + ffreg_t out_rate_head; /* Out of rate head */ + u_int filler7d[0xca-0x7d]; /* pad out to full address space */ + ffreg_t cell_ctr_high1_nc;/* Total cell transfer count (high) */ + ffreg_t cell_ctr_lo1_nc;/* Total cell transfer count (low) */ + u_int fillercc[0x100-0xcc]; /* pad out to full address space */ } ffredn_t; typedef struct _rfredn_t { @@ -889,79 +889,71 @@ typedef struct ia_rtn_q { } IARTN_Q; #define SUNI_LOSV 0x04 -typedef struct { - u32 suni_master_reset; /* SUNI Master Reset and Identity */ - u32 suni_master_config; /* SUNI Master Configuration */ - u32 suni_master_intr_stat; /* SUNI Master Interrupt Status */ - u32 suni_reserved1; /* Reserved */ - u32 suni_master_clk_monitor;/* SUNI Master Clock Monitor */ - u32 suni_master_control; /* SUNI Master Clock Monitor */ - u32 suni_reserved2[10]; /* Reserved */ - - u32 suni_rsop_control; /* RSOP Control/Interrupt Enable */ - u32 suni_rsop_status; /* RSOP Status/Interrupt States */ - u32 suni_rsop_section_bip8l;/* RSOP Section BIP-8 LSB */ - u32 suni_rsop_section_bip8m;/* RSOP Section BIP-8 MSB */ - - u32 suni_tsop_control; /* TSOP Control */ - u32 suni_tsop_diag; /* TSOP Disgnostics */ - u32 suni_tsop_reserved[2]; /* TSOP Reserved */ - - u32 suni_rlop_cs; /* RLOP Control/Status */ - u32 suni_rlop_intr; /* RLOP Interrupt Enable/Status */ - u32 suni_rlop_line_bip24l; /* RLOP Line BIP-24 LSB */ - u32 suni_rlop_line_bip24; /* RLOP Line BIP-24 */ - u32 suni_rlop_line_bip24m; /* RLOP Line BIP-24 MSB */ - u32 suni_rlop_line_febel; /* RLOP Line FEBE LSB */ - u32 suni_rlop_line_febe; /* RLOP Line FEBE */ - u32 suni_rlop_line_febem; /* RLOP Line FEBE MSB */ - - u32 suni_tlop_control; /* TLOP Control */ - u32 suni_tlop_disg; /* TLOP Disgnostics */ - u32 suni_tlop_reserved[14]; /* TLOP Reserved */ - - u32 suni_rpop_cs; /* RPOP Status/Control */ - u32 suni_rpop_intr; /* RPOP Interrupt/Status */ - u32 suni_rpop_reserved; /* RPOP Reserved */ - u32 suni_rpop_intr_ena; /* RPOP Interrupt Enable */ - u32 suni_rpop_reserved1[3]; /* RPOP Reserved */ - u32 suni_rpop_path_sig; /* RPOP Path Signal Label */ - u32 suni_rpop_bip8l; /* RPOP Path BIP-8 LSB */ - u32 suni_rpop_bip8m; /* RPOP Path BIP-8 MSB */ - u32 suni_rpop_febel; /* RPOP Path FEBE LSB */ - u32 suni_rpop_febem; /* RPOP Path FEBE MSB */ - u32 suni_rpop_reserved2[4]; /* RPOP Reserved */ - - u32 suni_tpop_cntrl_daig; /* TPOP Control/Disgnostics */ - u32 suni_tpop_pointer_ctrl; /* TPOP Pointer Control */ - u32 suni_tpop_sourcer_ctrl; /* TPOP Source Control */ - u32 suni_tpop_reserved1[2]; /* TPOP Reserved */ - u32 suni_tpop_arb_prtl; /* TPOP Arbitrary Pointer LSB */ - u32 suni_tpop_arb_prtm; /* TPOP Arbitrary Pointer MSB */ - u32 suni_tpop_reserved2; /* TPOP Reserved */ - u32 suni_tpop_path_sig; /* TPOP Path Signal Lable */ - u32 suni_tpop_path_status; /* TPOP Path Status */ - u32 suni_tpop_reserved3[6]; /* TPOP Reserved */ - - u32 suni_racp_cs; /* RACP Control/Status */ - u32 suni_racp_intr; /* RACP Interrupt Enable/Status */ - u32 suni_racp_hdr_pattern; /* RACP Match Header Pattern */ - u32 suni_racp_hdr_mask; /* RACP Match Header Mask */ - u32 suni_racp_corr_hcs; /* RACP Correctable HCS Error Count */ - u32 suni_racp_uncorr_hcs; /* RACP Uncorrectable HCS Error Count */ - u32 suni_racp_reserved[10]; /* RACP Reserved */ - - u32 suni_tacp_control; /* TACP Control */ - u32 suni_tacp_idle_hdr_pat; /* TACP Idle Cell Header Pattern */ - u32 suni_tacp_idle_pay_pay; /* TACP Idle Cell Payld Octet Pattern */ - u32 suni_tacp_reserved[5]; /* TACP Reserved */ - - u32 suni_reserved3[24]; /* Reserved */ - - u32 suni_master_test; /* SUNI Master Test */ - u32 suni_reserved_test; /* SUNI Reserved for Test */ -} IA_SUNI; - +enum ia_suni { + SUNI_MASTER_RESET = 0x000, /* SUNI Master Reset and Identity */ + SUNI_MASTER_CONFIG = 0x004, /* SUNI Master Configuration */ + SUNI_MASTER_INTR_STAT = 0x008, /* SUNI Master Interrupt Status */ + SUNI_RESERVED1 = 0x00c, /* Reserved */ + SUNI_MASTER_CLK_MONITOR = 0x010, /* SUNI Master Clock Monitor */ + SUNI_MASTER_CONTROL = 0x014, /* SUNI Master Clock Monitor */ + /* Reserved (10) */ + SUNI_RSOP_CONTROL = 0x040, /* RSOP Control/Interrupt Enable */ + SUNI_RSOP_STATUS = 0x044, /* RSOP Status/Interrupt States */ + SUNI_RSOP_SECTION_BIP8L = 0x048, /* RSOP Section BIP-8 LSB */ + SUNI_RSOP_SECTION_BIP8M = 0x04c, /* RSOP Section BIP-8 MSB */ + + SUNI_TSOP_CONTROL = 0x050, /* TSOP Control */ + SUNI_TSOP_DIAG = 0x054, /* TSOP Disgnostics */ + /* Reserved (2) */ + SUNI_RLOP_CS = 0x060, /* RLOP Control/Status */ + SUNI_RLOP_INTR = 0x064, /* RLOP Interrupt Enable/Status */ + SUNI_RLOP_LINE_BIP24L = 0x068, /* RLOP Line BIP-24 LSB */ + SUNI_RLOP_LINE_BIP24 = 0x06c, /* RLOP Line BIP-24 */ + SUNI_RLOP_LINE_BIP24M = 0x070, /* RLOP Line BIP-24 MSB */ + SUNI_RLOP_LINE_FEBEL = 0x074, /* RLOP Line FEBE LSB */ + SUNI_RLOP_LINE_FEBE = 0x078, /* RLOP Line FEBE */ + SUNI_RLOP_LINE_FEBEM = 0x07c, /* RLOP Line FEBE MSB */ + + SUNI_TLOP_CONTROL = 0x080, /* TLOP Control */ + SUNI_TLOP_DISG = 0x084, /* TLOP Disgnostics */ + /* Reserved (14) */ + SUNI_RPOP_CS = 0x0c0, /* RPOP Status/Control */ + SUNI_RPOP_INTR = 0x0c4, /* RPOP Interrupt/Status */ + SUNI_RPOP_RESERVED = 0x0c8, /* RPOP Reserved */ + SUNI_RPOP_INTR_ENA = 0x0cc, /* RPOP Interrupt Enable */ + /* Reserved (3) */ + SUNI_RPOP_PATH_SIG = 0x0dc, /* RPOP Path Signal Label */ + SUNI_RPOP_BIP8L = 0x0e0, /* RPOP Path BIP-8 LSB */ + SUNI_RPOP_BIP8M = 0x0e4, /* RPOP Path BIP-8 MSB */ + SUNI_RPOP_FEBEL = 0x0e8, /* RPOP Path FEBE LSB */ + SUNI_RPOP_FEBEM = 0x0ec, /* RPOP Path FEBE MSB */ + /* Reserved (4) */ + SUNI_TPOP_CNTRL_DAIG = 0x100, /* TPOP Control/Disgnostics */ + SUNI_TPOP_POINTER_CTRL = 0x104, /* TPOP Pointer Control */ + SUNI_TPOP_SOURCER_CTRL = 0x108, /* TPOP Source Control */ + /* Reserved (2) */ + SUNI_TPOP_ARB_PRTL = 0x114, /* TPOP Arbitrary Pointer LSB */ + SUNI_TPOP_ARB_PRTM = 0x118, /* TPOP Arbitrary Pointer MSB */ + SUNI_TPOP_RESERVED2 = 0x11c, /* TPOP Reserved */ + SUNI_TPOP_PATH_SIG = 0x120, /* TPOP Path Signal Lable */ + SUNI_TPOP_PATH_STATUS = 0x124, /* TPOP Path Status */ + /* Reserved (6) */ + SUNI_RACP_CS = 0x140, /* RACP Control/Status */ + SUNI_RACP_INTR = 0x144, /* RACP Interrupt Enable/Status */ + SUNI_RACP_HDR_PATTERN = 0x148, /* RACP Match Header Pattern */ + SUNI_RACP_HDR_MASK = 0x14c, /* RACP Match Header Mask */ + SUNI_RACP_CORR_HCS = 0x150, /* RACP Correctable HCS Error Count */ + SUNI_RACP_UNCORR_HCS = 0x154, /* RACP Uncorrectable HCS Err Count */ + /* Reserved (10) */ + SUNI_TACP_CONTROL = 0x180, /* TACP Control */ + SUNI_TACP_IDLE_HDR_PAT = 0x184, /* TACP Idle Cell Header Pattern */ + SUNI_TACP_IDLE_PAY_PAY = 0x188, /* TACP Idle Cell Payld Octet Patrn */ + /* Reserved (5) */ + /* Reserved (24) */ + /* FIXME: unused but name conflicts. + * SUNI_MASTER_TEST = 0x200, SUNI Master Test */ + SUNI_RESERVED_TEST = 0x204 /* SUNI Reserved for Test */ +}; typedef struct _SUNI_STATS_ { @@ -993,13 +985,11 @@ typedef struct _SUNI_STATS_ u32 racp_uchcs_count; // uncorrectable HCS error count } IA_SUNI_STATS; -typedef struct iadev_t { +typedef struct iadev_priv { /*-----base pointers into (i)chipSAR+ address space */ - u32 __iomem *phy; /* base pointer into phy(SUNI) */ - u32 __iomem *dma; /* base pointer into DMA control - registers */ - u32 __iomem *reg; /* base pointer to SAR registers - - Bus Interface Control Regs */ + u32 __iomem *phy; /* Base pointer into phy (SUNI). */ + u32 __iomem *dma; /* Base pointer into DMA control registers. */ + u32 __iomem *reg; /* Base pointer to SAR registers. */ u32 __iomem *seg_reg; /* base pointer to segmentation engine internal registers */ u32 __iomem *reass_reg; /* base pointer to reassemble engine @@ -1022,10 +1012,11 @@ typedef struct iadev_t { struct dle_q rx_dle_q; struct free_desc_q *rx_free_desc_qhead; struct sk_buff_head rx_dma_q; - spinlock_t rx_lock, misc_lock; + spinlock_t rx_lock; struct atm_vcc **rx_open; /* list of all open VCs */ u16 num_rx_desc, rx_buf_sz, rxing; - u32 rx_pkt_ram, rx_tmp_cnt, rx_tmp_jif; + u32 rx_pkt_ram, rx_tmp_cnt; + unsigned long rx_tmp_jif; void __iomem *RX_DESC_BASE_ADDR; u32 drop_rxpkt, drop_rxcell, rx_cell_cnt, rx_pkt_cnt; struct atm_dev *next_board; /* other iphase devices */ @@ -1070,14 +1061,14 @@ typedef struct iadev_t { #define INPH_IA_VCC(v) ((struct ia_vcc *) (v)->dev_data) /******************* IDT77105 25MB/s PHY DEFINE *****************************/ -typedef struct { - u_int mb25_master_ctrl; /* Master control */ - u_int mb25_intr_status; /* Interrupt status */ - u_int mb25_diag_control; /* Diagnostic control */ - u_int mb25_led_hec; /* LED driver and HEC status/control */ - u_int mb25_low_byte_counter; /* Low byte counter */ - u_int mb25_high_byte_counter; /* High byte counter */ -} ia_mb25_t; +enum ia_mb25 { + MB25_MASTER_CTRL = 0x00, /* Master control */ + MB25_INTR_STATUS = 0x04, /* Interrupt status */ + MB25_DIAG_CONTROL = 0x08, /* Diagnostic control */ + MB25_LED_HEC = 0x0c, /* LED driver and HEC status/control */ + MB25_LOW_BYTE_COUNTER = 0x10, + MB25_HIGH_BYTE_COUNTER = 0x14 +}; /* * Master Control @@ -1126,122 +1117,121 @@ typedef struct { #define FE_E3_PHY 0x0090 /* E3 */ /*********************** SUNI_PM7345 PHY DEFINE HERE *********************/ -typedef struct _suni_pm7345_t -{ - u_int suni_config; /* SUNI Configuration */ - u_int suni_intr_enbl; /* SUNI Interrupt Enable */ - u_int suni_intr_stat; /* SUNI Interrupt Status */ - u_int suni_control; /* SUNI Control */ - u_int suni_id_reset; /* SUNI Reset and Identity */ - u_int suni_data_link_ctrl; - u_int suni_rboc_conf_intr_enbl; - u_int suni_rboc_stat; - u_int suni_ds3_frm_cfg; - u_int suni_ds3_frm_intr_enbl; - u_int suni_ds3_frm_intr_stat; - u_int suni_ds3_frm_stat; - u_int suni_rfdl_cfg; - u_int suni_rfdl_enbl_stat; - u_int suni_rfdl_stat; - u_int suni_rfdl_data; - u_int suni_pmon_chng; - u_int suni_pmon_intr_enbl_stat; - u_int suni_reserved1[0x13-0x11]; - u_int suni_pmon_lcv_evt_cnt_lsb; - u_int suni_pmon_lcv_evt_cnt_msb; - u_int suni_pmon_fbe_evt_cnt_lsb; - u_int suni_pmon_fbe_evt_cnt_msb; - u_int suni_pmon_sez_det_cnt_lsb; - u_int suni_pmon_sez_det_cnt_msb; - u_int suni_pmon_pe_evt_cnt_lsb; - u_int suni_pmon_pe_evt_cnt_msb; - u_int suni_pmon_ppe_evt_cnt_lsb; - u_int suni_pmon_ppe_evt_cnt_msb; - u_int suni_pmon_febe_evt_cnt_lsb; - u_int suni_pmon_febe_evt_cnt_msb; - u_int suni_ds3_tran_cfg; - u_int suni_ds3_tran_diag; - u_int suni_reserved2[0x23-0x21]; - u_int suni_xfdl_cfg; - u_int suni_xfdl_intr_st; - u_int suni_xfdl_xmit_data; - u_int suni_xboc_code; - u_int suni_splr_cfg; - u_int suni_splr_intr_en; - u_int suni_splr_intr_st; - u_int suni_splr_status; - u_int suni_splt_cfg; - u_int suni_splt_cntl; - u_int suni_splt_diag_g1; - u_int suni_splt_f1; - u_int suni_cppm_loc_meters; - u_int suni_cppm_chng_of_cppm_perf_meter; - u_int suni_cppm_b1_err_cnt_lsb; - u_int suni_cppm_b1_err_cnt_msb; - u_int suni_cppm_framing_err_cnt_lsb; - u_int suni_cppm_framing_err_cnt_msb; - u_int suni_cppm_febe_cnt_lsb; - u_int suni_cppm_febe_cnt_msb; - u_int suni_cppm_hcs_err_cnt_lsb; - u_int suni_cppm_hcs_err_cnt_msb; - u_int suni_cppm_idle_un_cell_cnt_lsb; - u_int suni_cppm_idle_un_cell_cnt_msb; - u_int suni_cppm_rcv_cell_cnt_lsb; - u_int suni_cppm_rcv_cell_cnt_msb; - u_int suni_cppm_xmit_cell_cnt_lsb; - u_int suni_cppm_xmit_cell_cnt_msb; - u_int suni_rxcp_ctrl; - u_int suni_rxcp_fctrl; - u_int suni_rxcp_intr_en_sts; - u_int suni_rxcp_idle_pat_h1; - u_int suni_rxcp_idle_pat_h2; - u_int suni_rxcp_idle_pat_h3; - u_int suni_rxcp_idle_pat_h4; - u_int suni_rxcp_idle_mask_h1; - u_int suni_rxcp_idle_mask_h2; - u_int suni_rxcp_idle_mask_h3; - u_int suni_rxcp_idle_mask_h4; - u_int suni_rxcp_cell_pat_h1; - u_int suni_rxcp_cell_pat_h2; - u_int suni_rxcp_cell_pat_h3; - u_int suni_rxcp_cell_pat_h4; - u_int suni_rxcp_cell_mask_h1; - u_int suni_rxcp_cell_mask_h2; - u_int suni_rxcp_cell_mask_h3; - u_int suni_rxcp_cell_mask_h4; - u_int suni_rxcp_hcs_cs; - u_int suni_rxcp_lcd_cnt_threshold; - u_int suni_reserved3[0x57-0x54]; - u_int suni_txcp_ctrl; - u_int suni_txcp_intr_en_sts; - u_int suni_txcp_idle_pat_h1; - u_int suni_txcp_idle_pat_h2; - u_int suni_txcp_idle_pat_h3; - u_int suni_txcp_idle_pat_h4; - u_int suni_txcp_idle_pat_h5; - u_int suni_txcp_idle_payload; - u_int suni_e3_frm_fram_options; - u_int suni_e3_frm_maint_options; - u_int suni_e3_frm_fram_intr_enbl; - u_int suni_e3_frm_fram_intr_ind_stat; - u_int suni_e3_frm_maint_intr_enbl; - u_int suni_e3_frm_maint_intr_ind; - u_int suni_e3_frm_maint_stat; - u_int suni_reserved4; - u_int suni_e3_tran_fram_options; - u_int suni_e3_tran_stat_diag_options; - u_int suni_e3_tran_bip_8_err_mask; - u_int suni_e3_tran_maint_adapt_options; - u_int suni_ttb_ctrl; - u_int suni_ttb_trail_trace_id_stat; - u_int suni_ttb_ind_addr; - u_int suni_ttb_ind_data; - u_int suni_ttb_exp_payload_type; - u_int suni_ttb_payload_type_ctrl_stat; - u_int suni_pad5[0x7f-0x71]; - u_int suni_master_test; - u_int suni_pad6[0xff-0x80]; -}suni_pm7345_t; +enum suni_pm7345 { + SUNI_CONFIG = 0x000, /* SUNI Configuration */ + SUNI_INTR_ENBL = 0x004, /* SUNI Interrupt Enable */ + SUNI_INTR_STAT = 0x008, /* SUNI Interrupt Status */ + SUNI_CONTROL = 0x00c, /* SUNI Control */ + SUNI_ID_RESET = 0x010, /* SUNI Reset and Identity */ + SUNI_DATA_LINK_CTRL = 0x014, + SUNI_RBOC_CONF_INTR_ENBL = 0x018, + SUNI_RBOC_STAT = 0x01c, + SUNI_DS3_FRM_CFG = 0x020, + SUNI_DS3_FRM_INTR_ENBL = 0x024, + SUNI_DS3_FRM_INTR_STAT = 0x028, + SUNI_DS3_FRM_STAT = 0x02c, + SUNI_RFDL_CFG = 0x030, + SUNI_RFDL_ENBL_STAT = 0x034, + SUNI_RFDL_STAT = 0x038, + SUNI_RFDL_DATA = 0x03c, + SUNI_PMON_CHNG = 0x040, + SUNI_PMON_INTR_ENBL_STAT = 0x044, + /* SUNI_RESERVED1 (0x13 - 0x11) */ + SUNI_PMON_LCV_EVT_CNT_LSB = 0x050, + SUNI_PMON_LCV_EVT_CNT_MSB = 0x054, + SUNI_PMON_FBE_EVT_CNT_LSB = 0x058, + SUNI_PMON_FBE_EVT_CNT_MSB = 0x05c, + SUNI_PMON_SEZ_DET_CNT_LSB = 0x060, + SUNI_PMON_SEZ_DET_CNT_MSB = 0x064, + SUNI_PMON_PE_EVT_CNT_LSB = 0x068, + SUNI_PMON_PE_EVT_CNT_MSB = 0x06c, + SUNI_PMON_PPE_EVT_CNT_LSB = 0x070, + SUNI_PMON_PPE_EVT_CNT_MSB = 0x074, + SUNI_PMON_FEBE_EVT_CNT_LSB = 0x078, + SUNI_PMON_FEBE_EVT_CNT_MSB = 0x07c, + SUNI_DS3_TRAN_CFG = 0x080, + SUNI_DS3_TRAN_DIAG = 0x084, + /* SUNI_RESERVED2 (0x23 - 0x21) */ + SUNI_XFDL_CFG = 0x090, + SUNI_XFDL_INTR_ST = 0x094, + SUNI_XFDL_XMIT_DATA = 0x098, + SUNI_XBOC_CODE = 0x09c, + SUNI_SPLR_CFG = 0x0a0, + SUNI_SPLR_INTR_EN = 0x0a4, + SUNI_SPLR_INTR_ST = 0x0a8, + SUNI_SPLR_STATUS = 0x0ac, + SUNI_SPLT_CFG = 0x0b0, + SUNI_SPLT_CNTL = 0x0b4, + SUNI_SPLT_DIAG_G1 = 0x0b8, + SUNI_SPLT_F1 = 0x0bc, + SUNI_CPPM_LOC_METERS = 0x0c0, + SUNI_CPPM_CHG_OF_CPPM_PERF_METR = 0x0c4, + SUNI_CPPM_B1_ERR_CNT_LSB = 0x0c8, + SUNI_CPPM_B1_ERR_CNT_MSB = 0x0cc, + SUNI_CPPM_FRAMING_ERR_CNT_LSB = 0x0d0, + SUNI_CPPM_FRAMING_ERR_CNT_MSB = 0x0d4, + SUNI_CPPM_FEBE_CNT_LSB = 0x0d8, + SUNI_CPPM_FEBE_CNT_MSB = 0x0dc, + SUNI_CPPM_HCS_ERR_CNT_LSB = 0x0e0, + SUNI_CPPM_HCS_ERR_CNT_MSB = 0x0e4, + SUNI_CPPM_IDLE_UN_CELL_CNT_LSB = 0x0e8, + SUNI_CPPM_IDLE_UN_CELL_CNT_MSB = 0x0ec, + SUNI_CPPM_RCV_CELL_CNT_LSB = 0x0f0, + SUNI_CPPM_RCV_CELL_CNT_MSB = 0x0f4, + SUNI_CPPM_XMIT_CELL_CNT_LSB = 0x0f8, + SUNI_CPPM_XMIT_CELL_CNT_MSB = 0x0fc, + SUNI_RXCP_CTRL = 0x100, + SUNI_RXCP_FCTRL = 0x104, + SUNI_RXCP_INTR_EN_STS = 0x108, + SUNI_RXCP_IDLE_PAT_H1 = 0x10c, + SUNI_RXCP_IDLE_PAT_H2 = 0x110, + SUNI_RXCP_IDLE_PAT_H3 = 0x114, + SUNI_RXCP_IDLE_PAT_H4 = 0x118, + SUNI_RXCP_IDLE_MASK_H1 = 0x11c, + SUNI_RXCP_IDLE_MASK_H2 = 0x120, + SUNI_RXCP_IDLE_MASK_H3 = 0x124, + SUNI_RXCP_IDLE_MASK_H4 = 0x128, + SUNI_RXCP_CELL_PAT_H1 = 0x12c, + SUNI_RXCP_CELL_PAT_H2 = 0x130, + SUNI_RXCP_CELL_PAT_H3 = 0x134, + SUNI_RXCP_CELL_PAT_H4 = 0x138, + SUNI_RXCP_CELL_MASK_H1 = 0x13c, + SUNI_RXCP_CELL_MASK_H2 = 0x140, + SUNI_RXCP_CELL_MASK_H3 = 0x144, + SUNI_RXCP_CELL_MASK_H4 = 0x148, + SUNI_RXCP_HCS_CS = 0x14c, + SUNI_RXCP_LCD_CNT_THRESHOLD = 0x150, + /* SUNI_RESERVED3 (0x57 - 0x54) */ + SUNI_TXCP_CTRL = 0x160, + SUNI_TXCP_INTR_EN_STS = 0x164, + SUNI_TXCP_IDLE_PAT_H1 = 0x168, + SUNI_TXCP_IDLE_PAT_H2 = 0x16c, + SUNI_TXCP_IDLE_PAT_H3 = 0x170, + SUNI_TXCP_IDLE_PAT_H4 = 0x174, + SUNI_TXCP_IDLE_PAT_H5 = 0x178, + SUNI_TXCP_IDLE_PAYLOAD = 0x17c, + SUNI_E3_FRM_FRAM_OPTIONS = 0x180, + SUNI_E3_FRM_MAINT_OPTIONS = 0x184, + SUNI_E3_FRM_FRAM_INTR_ENBL = 0x188, + SUNI_E3_FRM_FRAM_INTR_IND_STAT = 0x18c, + SUNI_E3_FRM_MAINT_INTR_ENBL = 0x190, + SUNI_E3_FRM_MAINT_INTR_IND = 0x194, + SUNI_E3_FRM_MAINT_STAT = 0x198, + SUNI_RESERVED4 = 0x19c, + SUNI_E3_TRAN_FRAM_OPTIONS = 0x1a0, + SUNI_E3_TRAN_STAT_DIAG_OPTIONS = 0x1a4, + SUNI_E3_TRAN_BIP_8_ERR_MASK = 0x1a8, + SUNI_E3_TRAN_MAINT_ADAPT_OPTS = 0x1ac, + SUNI_TTB_CTRL = 0x1b0, + SUNI_TTB_TRAIL_TRACE_ID_STAT = 0x1b4, + SUNI_TTB_IND_ADDR = 0x1b8, + SUNI_TTB_IND_DATA = 0x1bc, + SUNI_TTB_EXP_PAYLOAD_TYPE = 0x1c0, + SUNI_TTB_PAYLOAD_TYPE_CTRL_STAT = 0x1c4, + /* SUNI_PAD5 (0x7f - 0x71) */ + SUNI_MASTER_TEST = 0x200, + /* SUNI_PAD6 (0xff - 0x80) */ +}; #define SUNI_PM7345_T suni_pm7345_t #define SUNI_PM7345 0x20 /* Suni chip type */ diff --git a/drivers/atm/lanai.c b/drivers/atm/lanai.c index 144a49f1522..fa7d701933b 100644 --- a/drivers/atm/lanai.c +++ b/drivers/atm/lanai.c @@ -55,6 +55,7 @@ */ #include <linux/module.h> +#include <linux/slab.h> #include <linux/mm.h> #include <linux/atmdev.h> #include <asm/io.h> @@ -306,11 +307,10 @@ static void vci_bitfield_iterate(struct lanai_dev *lanai, const unsigned long *lp, void (*func)(struct lanai_dev *,vci_t vci)) { - vci_t vci = find_first_bit(lp, NUM_VCI); - while (vci < NUM_VCI) { + vci_t vci; + + for_each_set_bit(vci, lp, NUM_VCI) func(lanai, vci); - vci = find_next_bit(lp, NUM_VCI, vci + 1); - } } /* -------------------- BUFFER UTILITIES: */ @@ -551,8 +551,8 @@ static inline void sram_write(const struct lanai_dev *lanai, writel(val, sram_addr(lanai, offset)); } -static int __devinit sram_test_word(const struct lanai_dev *lanai, - int offset, u32 pattern) +static int sram_test_word(const struct lanai_dev *lanai, int offset, + u32 pattern) { u32 readback; sram_write(lanai, pattern, offset); @@ -566,7 +566,7 @@ static int __devinit sram_test_word(const struct lanai_dev *lanai, return -EIO; } -static int __devinit sram_test_pass(const struct lanai_dev *lanai, u32 pattern) +static int sram_test_pass(const struct lanai_dev *lanai, u32 pattern) { int offset, result = 0; for (offset = 0; offset < SRAM_BYTES && result == 0; offset += 4) @@ -574,7 +574,7 @@ static int __devinit sram_test_pass(const struct lanai_dev *lanai, u32 pattern) return result; } -static int __devinit sram_test_and_clear(const struct lanai_dev *lanai) +static int sram_test_and_clear(const struct lanai_dev *lanai) { #ifdef FULL_MEMORY_TEST int result; @@ -860,7 +860,7 @@ static inline void aal0_buffer_free(struct lanai_dev *lanai) #ifndef READ_EEPROM /* Stub functions to use if EEPROM reading is disabled */ -static int __devinit eeprom_read(struct lanai_dev *lanai) +static int eeprom_read(struct lanai_dev *lanai) { printk(KERN_INFO DEV_LABEL "(itf %d): *NOT* reading EEPROM\n", lanai->number); @@ -868,7 +868,7 @@ static int __devinit eeprom_read(struct lanai_dev *lanai) return 0; } -static int __devinit eeprom_validate(struct lanai_dev *lanai) +static int eeprom_validate(struct lanai_dev *lanai) { lanai->serialno = 0; lanai->magicno = EEPROM_MAGIC_VALUE; @@ -877,7 +877,7 @@ static int __devinit eeprom_validate(struct lanai_dev *lanai) #else /* READ_EEPROM */ -static int __devinit eeprom_read(struct lanai_dev *lanai) +static int eeprom_read(struct lanai_dev *lanai) { int i, address; u8 data; @@ -901,7 +901,7 @@ static int __devinit eeprom_read(struct lanai_dev *lanai) clock_l(); udelay(5); for (i = 128; i != 0; i >>= 1) { /* write command out */ tmp = (lanai->conf1 & ~CONFIG1_PROMDATA) | - (data & i) ? CONFIG1_PROMDATA : 0; + ((data & i) ? CONFIG1_PROMDATA : 0); if (lanai->conf1 != tmp) { set_config1(tmp); udelay(5); /* Let new data settle */ @@ -953,7 +953,7 @@ static inline u32 eeprom_be4(const struct lanai_dev *lanai, int address) } /* Checksum/validate EEPROM contents */ -static int __devinit eeprom_validate(struct lanai_dev *lanai) +static int eeprom_validate(struct lanai_dev *lanai) { int i, s; u32 v; @@ -998,9 +998,7 @@ static int __devinit eeprom_validate(struct lanai_dev *lanai) (unsigned int) e[EEPROM_MAC_REV + i]); return -EIO; } - DPRINTK("eeprom: MAC address = %02X:%02X:%02X:%02X:%02X:%02X\n", - e[EEPROM_MAC + 0], e[EEPROM_MAC + 1], e[EEPROM_MAC + 2], - e[EEPROM_MAC + 3], e[EEPROM_MAC + 4], e[EEPROM_MAC + 5]); + DPRINTK("eeprom: MAC address = %pM\n", &e[EEPROM_MAC]); /* Verify serial number */ lanai->serialno = eeprom_be4(lanai, EEPROM_SERIAL); v = eeprom_be4(lanai, EEPROM_SERIAL_REV); @@ -1257,7 +1255,7 @@ static inline void lanai_endtx(struct lanai_dev *lanai, /* * Since the "butt register" is a shared resounce on the card we * serialize all accesses to it through this spinlock. This is - * mostly just paranoia sicne the register is rarely "busy" anyway + * mostly just paranoia since the register is rarely "busy" anyway * but is needed for correctness. */ spin_lock(&lanai->endtxlock); @@ -1450,7 +1448,7 @@ static void vcc_rx_aal0(struct lanai_dev *lanai) #include <linux/vmalloc.h> #endif -static int __devinit vcc_table_allocate(struct lanai_dev *lanai) +static int vcc_table_allocate(struct lanai_dev *lanai) { #ifdef VCCTABLE_GETFREEPAGE APRINTK((lanai->num_vci) * sizeof(struct lanai_vcc *) <= PAGE_SIZE, @@ -1459,10 +1457,9 @@ static int __devinit vcc_table_allocate(struct lanai_dev *lanai) return (lanai->vccs == NULL) ? -ENOMEM : 0; #else int bytes = (lanai->num_vci) * sizeof(struct lanai_vcc *); - lanai->vccs = (struct lanai_vcc **) vmalloc(bytes); + lanai->vccs = vzalloc(bytes); if (unlikely(lanai->vccs == NULL)) return -ENOMEM; - memset(lanai->vccs, 0, bytes); return 0; #endif } @@ -1575,7 +1572,7 @@ static inline void host_vcc_unbind(struct lanai_dev *lanai, static void lanai_reset(struct lanai_dev *lanai) { - printk(KERN_CRIT DEV_LABEL "(itf %d): *NOT* reseting - not " + printk(KERN_CRIT DEV_LABEL "(itf %d): *NOT* resetting - not " "implemented\n", lanai->number); /* TODO */ /* The following is just a hack until we write the real @@ -1591,7 +1588,7 @@ static void lanai_reset(struct lanai_dev *lanai) /* * Allocate service buffer and tell card about it */ -static int __devinit service_buffer_allocate(struct lanai_dev *lanai) +static int service_buffer_allocate(struct lanai_dev *lanai) { lanai_buf_allocate(&lanai->service, SERVICE_ENTRIES * 4, 8, lanai->pci); @@ -1945,11 +1942,10 @@ static int check_board_id_and_rev(const char *name, u32 val, int *revp) /* -------------------- PCI INITIALIZATION/SHUTDOWN: */ -static int __devinit lanai_pci_start(struct lanai_dev *lanai) +static int lanai_pci_start(struct lanai_dev *lanai) { struct pci_dev *pci = lanai->pci; int result; - u16 w; if (pci_enable_device(pci) != 0) { printk(KERN_ERR DEV_LABEL "(itf %d): can't enable " @@ -1957,23 +1953,17 @@ static int __devinit lanai_pci_start(struct lanai_dev *lanai) return -ENXIO; } pci_set_master(pci); - if (pci_set_dma_mask(pci, DMA_32BIT_MASK) != 0) { + if (pci_set_dma_mask(pci, DMA_BIT_MASK(32)) != 0) { printk(KERN_WARNING DEV_LABEL "(itf %d): No suitable DMA available.\n", lanai->number); return -EBUSY; } - if (pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK) != 0) { + if (pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32)) != 0) { printk(KERN_WARNING DEV_LABEL "(itf %d): No suitable DMA available.\n", lanai->number); return -EBUSY; } - result = pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &w); - if (result != PCIBIOS_SUCCESSFUL) { - printk(KERN_ERR DEV_LABEL "(itf %d): can't read " - "PCI_SUBSYSTEM_ID: %d\n", lanai->number, result); - return -EINVAL; - } - result = check_board_id_and_rev("PCI", w, NULL); + result = check_board_id_and_rev("PCI", pci->subsystem_device, NULL); if (result != 0) return result; /* Set latency timer to zero as per lanai docs */ @@ -1992,7 +1982,7 @@ static int __devinit lanai_pci_start(struct lanai_dev *lanai) /* * We _can_ use VCI==0 for normal traffic, but only for UBR (or we'll - * get a CBRZERO interrupt), and we can use it only if noone is receiving + * get a CBRZERO interrupt), and we can use it only if no one is receiving * AAL0 traffic (since they will use the same queue) - according to the * docs we shouldn't even use it for AAL0 traffic */ @@ -2133,7 +2123,7 @@ static inline void lanai_cbr_shutdown(struct lanai_dev *lanai) /* -------------------- OPERATIONS: */ /* setup a newly detected device */ -static int __devinit lanai_dev_open(struct atm_dev *atmdev) +static int lanai_dev_open(struct atm_dev *atmdev) { struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data; unsigned long raw_base; @@ -2243,11 +2233,8 @@ static int __devinit lanai_dev_open(struct atm_dev *atmdev) memcpy(atmdev->esi, eeprom_mac(lanai), ESI_LEN); lanai_timed_poll_start(lanai); printk(KERN_NOTICE DEV_LABEL "(itf %d): rev.%d, base=0x%lx, irq=%u " - "(%02X-%02X-%02X-%02X-%02X-%02X)\n", lanai->number, - (int) lanai->pci->revision, (unsigned long) lanai->base, - lanai->pci->irq, - atmdev->esi[0], atmdev->esi[1], atmdev->esi[2], - atmdev->esi[3], atmdev->esi[4], atmdev->esi[5]); + "(%pMF)\n", lanai->number, (int) lanai->pci->revision, + (unsigned long) lanai->base, lanai->pci->irq, atmdev->esi); printk(KERN_NOTICE DEV_LABEL "(itf %d): LANAI%s, serialno=%u(0x%X), " "board_rev=%d\n", lanai->number, lanai->type==lanai2 ? "2" : "HB", (unsigned int) lanai->serialno, @@ -2483,14 +2470,8 @@ static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page) return sprintf(page, "revision: board=%d, pci_if=%d\n", lanai->board_rev, (int) lanai->pci->revision); if (left-- == 0) - return sprintf(page, "EEPROM ESI: " - "%02X:%02X:%02X:%02X:%02X:%02X\n", - lanai->eeprom[EEPROM_MAC + 0], - lanai->eeprom[EEPROM_MAC + 1], - lanai->eeprom[EEPROM_MAC + 2], - lanai->eeprom[EEPROM_MAC + 3], - lanai->eeprom[EEPROM_MAC + 4], - lanai->eeprom[EEPROM_MAC + 5]); + return sprintf(page, "EEPROM ESI: %pM\n", + &lanai->eeprom[EEPROM_MAC]); if (left-- == 0) return sprintf(page, "status: SOOL=%d, LOCD=%d, LED=%d, " "GPIN=%d\n", (lanai->status & STATUS_SOOL) ? 1 : 0, @@ -2585,8 +2566,8 @@ static const struct atmdev_ops ops = { }; /* initialize one probed card */ -static int __devinit lanai_init_one(struct pci_dev *pci, - const struct pci_device_id *ident) +static int lanai_init_one(struct pci_dev *pci, + const struct pci_device_id *ident) { struct lanai_dev *lanai; struct atm_dev *atmdev; @@ -2599,7 +2580,7 @@ static int __devinit lanai_init_one(struct pci_dev *pci, return -ENOMEM; } - atmdev = atm_dev_register(DEV_LABEL, &ops, -1, NULL); + atmdev = atm_dev_register(DEV_LABEL, &pci->dev, &ops, -1, NULL); if (atmdev == NULL) { printk(KERN_ERR DEV_LABEL ": couldn't register atm device!\n"); diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c index 0c205b000e8..9988ac98b6d 100644 --- a/drivers/atm/nicstar.c +++ b/drivers/atm/nicstar.c @@ -1,5 +1,4 @@ -/****************************************************************************** - * +/* * nicstar.c * * Device driver supporting CBR for IDT 77201/77211 "NICStAR" based cards. @@ -16,12 +15,10 @@ * * * (C) INESC 1999 - * - * - ******************************************************************************/ - + */ -/**** IMPORTANT INFORMATION *************************************************** +/* + * IMPORTANT INFORMATION * * There are currently three types of spinlocks: * @@ -31,9 +28,9 @@ * * These must NEVER be grabbed in reverse order. * - ******************************************************************************/ + */ -/* Header files ***************************************************************/ +/* Header files */ #include <linux/module.h> #include <linux/kernel.h> @@ -41,6 +38,7 @@ #include <linux/atmdev.h> #include <linux/atm.h> #include <linux/pci.h> +#include <linux/dma-mapping.h> #include <linux/types.h> #include <linux/string.h> #include <linux/delay.h> @@ -49,9 +47,12 @@ #include <linux/timer.h> #include <linux/interrupt.h> #include <linux/bitops.h> +#include <linux/slab.h> +#include <linux/idr.h> #include <asm/io.h> #include <asm/uaccess.h> -#include <asm/atomic.h> +#include <linux/atomic.h> +#include <linux/etherdevice.h> #include "nicstar.h" #ifdef CONFIG_ATM_NICSTAR_USE_SUNI #include "suni.h" @@ -60,16 +61,11 @@ #include "idt77105.h" #endif /* CONFIG_ATM_NICSTAR_USE_IDT77105 */ -#if BITS_PER_LONG != 32 -# error FIXME: this driver requires a 32-bit platform -#endif - -/* Additional code ************************************************************/ +/* Additional code */ #include "nicstarmac.c" - -/* Configurable parameters ****************************************************/ +/* Configurable parameters */ #undef PHY_LOOPBACK #undef TX_DEBUG @@ -77,11 +73,10 @@ #undef GENERAL_DEBUG #undef EXTRA_DEBUG -#undef NS_USE_DESTRUCTORS /* For now keep this undefined unless you know - you're going to use only raw ATM */ - +#undef NS_USE_DESTRUCTORS /* For now keep this undefined unless you know + you're going to use only raw ATM */ -/* Do not touch these *********************************************************/ +/* Do not touch these */ #ifdef TX_DEBUG #define TXPRINTK(args...) printk(args) @@ -107,2989 +102,2736 @@ #define XPRINTK(args...) #endif /* EXTRA_DEBUG */ - -/* Macros *********************************************************************/ +/* Macros */ #define CMD_BUSY(card) (readl((card)->membase + STAT) & NS_STAT_CMDBZ) #define NS_DELAY mdelay(1) -#define ALIGN_BUS_ADDR(addr, alignment) \ - ((((u32) (addr)) + (((u32) (alignment)) - 1)) & ~(((u32) (alignment)) - 1)) -#define ALIGN_ADDRESS(addr, alignment) \ - bus_to_virt(ALIGN_BUS_ADDR(virt_to_bus(addr), alignment)) - -#undef CEIL +#define PTR_DIFF(a, b) ((u32)((unsigned long)(a) - (unsigned long)(b))) #ifndef ATM_SKB #define ATM_SKB(s) (&(s)->atm) #endif - /* Spinlock debugging stuff */ -#ifdef NS_DEBUG_SPINLOCKS /* See nicstar.h */ -#define ns_grab_int_lock(card,flags) \ - do { \ - unsigned long nsdsf, nsdsf2; \ - local_irq_save(flags); \ - save_flags(nsdsf); cli();\ - if (nsdsf & (1<<9)) printk ("nicstar.c: ints %sabled -> enabled.\n", \ - (flags)&(1<<9)?"en":"dis"); \ - if (spin_is_locked(&(card)->int_lock) && \ - (card)->cpu_int == smp_processor_id()) { \ - printk("nicstar.c: line %d (cpu %d) int_lock already locked at line %d (cpu %d)\n", \ - __LINE__, smp_processor_id(), (card)->has_int_lock, \ - (card)->cpu_int); \ - printk("nicstar.c: ints were %sabled.\n", ((flags)&(1<<9)?"en":"dis")); \ - } \ - if (spin_is_locked(&(card)->res_lock) && \ - (card)->cpu_res == smp_processor_id()) { \ - printk("nicstar.c: line %d (cpu %d) res_lock locked at line %d (cpu %d)(trying int)\n", \ - __LINE__, smp_processor_id(), (card)->has_res_lock, \ - (card)->cpu_res); \ - printk("nicstar.c: ints were %sabled.\n", ((flags)&(1<<9)?"en":"dis")); \ - } \ - spin_lock_irq(&(card)->int_lock); \ - (card)->has_int_lock = __LINE__; \ - (card)->cpu_int = smp_processor_id(); \ - restore_flags(nsdsf); } while (0) -#define ns_grab_res_lock(card,flags) \ - do { \ - unsigned long nsdsf, nsdsf2; \ - local_irq_save(flags); \ - save_flags(nsdsf); cli();\ - if (nsdsf & (1<<9)) printk ("nicstar.c: ints %sabled -> enabled.\n", \ - (flags)&(1<<9)?"en":"dis"); \ - if (spin_is_locked(&(card)->res_lock) && \ - (card)->cpu_res == smp_processor_id()) { \ - printk("nicstar.c: line %d (cpu %d) res_lock already locked at line %d (cpu %d)\n", \ - __LINE__, smp_processor_id(), (card)->has_res_lock, \ - (card)->cpu_res); \ - printk("nicstar.c: ints were %sabled.\n", ((flags)&(1<<9)?"en":"dis")); \ - } \ - spin_lock_irq(&(card)->res_lock); \ - (card)->has_res_lock = __LINE__; \ - (card)->cpu_res = smp_processor_id(); \ - restore_flags(nsdsf); } while (0) -#define ns_grab_scq_lock(card,scq,flags) \ - do { \ - unsigned long nsdsf, nsdsf2; \ - local_irq_save(flags); \ - save_flags(nsdsf); cli();\ - if (nsdsf & (1<<9)) printk ("nicstar.c: ints %sabled -> enabled.\n", \ - (flags)&(1<<9)?"en":"dis"); \ - if (spin_is_locked(&(scq)->lock) && \ - (scq)->cpu_lock == smp_processor_id()) { \ - printk("nicstar.c: line %d (cpu %d) this scq_lock already locked at line %d (cpu %d)\n", \ - __LINE__, smp_processor_id(), (scq)->has_lock, \ - (scq)->cpu_lock); \ - printk("nicstar.c: ints were %sabled.\n", ((flags)&(1<<9)?"en":"dis")); \ - } \ - if (spin_is_locked(&(card)->res_lock) && \ - (card)->cpu_res == smp_processor_id()) { \ - printk("nicstar.c: line %d (cpu %d) res_lock locked at line %d (cpu %d)(trying scq)\n", \ - __LINE__, smp_processor_id(), (card)->has_res_lock, \ - (card)->cpu_res); \ - printk("nicstar.c: ints were %sabled.\n", ((flags)&(1<<9)?"en":"dis")); \ - } \ - spin_lock_irq(&(scq)->lock); \ - (scq)->has_lock = __LINE__; \ - (scq)->cpu_lock = smp_processor_id(); \ - restore_flags(nsdsf); } while (0) -#else /* !NS_DEBUG_SPINLOCKS */ -#define ns_grab_int_lock(card,flags) \ - spin_lock_irqsave(&(card)->int_lock,(flags)) -#define ns_grab_res_lock(card,flags) \ - spin_lock_irqsave(&(card)->res_lock,(flags)) -#define ns_grab_scq_lock(card,scq,flags) \ - spin_lock_irqsave(&(scq)->lock,flags) -#endif /* NS_DEBUG_SPINLOCKS */ - - -/* Function declarations ******************************************************/ - -static u32 ns_read_sram(ns_dev *card, u32 sram_address); -static void ns_write_sram(ns_dev *card, u32 sram_address, u32 *value, int count); -static int __devinit ns_init_card(int i, struct pci_dev *pcidev); -static void __devinit ns_init_card_error(ns_dev *card, int error); -static scq_info *get_scq(int size, u32 scd); -static void free_scq(scq_info *scq, struct atm_vcc *vcc); +#define scq_virt_to_bus(scq, p) \ + (scq->dma + ((unsigned long)(p) - (unsigned long)(scq)->org)) + +/* Function declarations */ + +static u32 ns_read_sram(ns_dev * card, u32 sram_address); +static void ns_write_sram(ns_dev * card, u32 sram_address, u32 * value, + int count); +static int ns_init_card(int i, struct pci_dev *pcidev); +static void ns_init_card_error(ns_dev * card, int error); +static scq_info *get_scq(ns_dev *card, int size, u32 scd); +static void free_scq(ns_dev *card, scq_info * scq, struct atm_vcc *vcc); static void push_rxbufs(ns_dev *, struct sk_buff *); static irqreturn_t ns_irq_handler(int irq, void *dev_id); static int ns_open(struct atm_vcc *vcc); static void ns_close(struct atm_vcc *vcc); -static void fill_tst(ns_dev *card, int n, vc_map *vc); +static void fill_tst(ns_dev * card, int n, vc_map * vc); static int ns_send(struct atm_vcc *vcc, struct sk_buff *skb); -static int push_scqe(ns_dev *card, vc_map *vc, scq_info *scq, ns_scqe *tbd, - struct sk_buff *skb); -static void process_tsq(ns_dev *card); -static void drain_scq(ns_dev *card, scq_info *scq, int pos); -static void process_rsq(ns_dev *card); -static void dequeue_rx(ns_dev *card, ns_rsqe *rsqe); +static int push_scqe(ns_dev * card, vc_map * vc, scq_info * scq, ns_scqe * tbd, + struct sk_buff *skb); +static void process_tsq(ns_dev * card); +static void drain_scq(ns_dev * card, scq_info * scq, int pos); +static void process_rsq(ns_dev * card); +static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe); #ifdef NS_USE_DESTRUCTORS static void ns_sb_destructor(struct sk_buff *sb); static void ns_lb_destructor(struct sk_buff *lb); static void ns_hb_destructor(struct sk_buff *hb); #endif /* NS_USE_DESTRUCTORS */ -static void recycle_rx_buf(ns_dev *card, struct sk_buff *skb); -static void recycle_iovec_rx_bufs(ns_dev *card, struct iovec *iov, int count); -static void recycle_iov_buf(ns_dev *card, struct sk_buff *iovb); -static void dequeue_sm_buf(ns_dev *card, struct sk_buff *sb); -static void dequeue_lg_buf(ns_dev *card, struct sk_buff *lb); -static int ns_proc_read(struct atm_dev *dev, loff_t *pos, char *page); -static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg); -static void which_list(ns_dev *card, struct sk_buff *skb); +static void recycle_rx_buf(ns_dev * card, struct sk_buff *skb); +static void recycle_iovec_rx_bufs(ns_dev * card, struct iovec *iov, int count); +static void recycle_iov_buf(ns_dev * card, struct sk_buff *iovb); +static void dequeue_sm_buf(ns_dev * card, struct sk_buff *sb); +static void dequeue_lg_buf(ns_dev * card, struct sk_buff *lb); +static int ns_proc_read(struct atm_dev *dev, loff_t * pos, char *page); +static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user * arg); +#ifdef EXTRA_DEBUG +static void which_list(ns_dev * card, struct sk_buff *skb); +#endif static void ns_poll(unsigned long arg); -static int ns_parse_mac(char *mac, unsigned char *esi); -static short ns_h2i(char c); static void ns_phy_put(struct atm_dev *dev, unsigned char value, - unsigned long addr); + unsigned long addr); static unsigned char ns_phy_get(struct atm_dev *dev, unsigned long addr); - - -/* Global variables ***********************************************************/ +/* Global variables */ static struct ns_dev *cards[NS_MAX_CARDS]; static unsigned num_cards; -static struct atmdev_ops atm_ops = -{ - .open = ns_open, - .close = ns_close, - .ioctl = ns_ioctl, - .send = ns_send, - .phy_put = ns_phy_put, - .phy_get = ns_phy_get, - .proc_read = ns_proc_read, - .owner = THIS_MODULE, +static struct atmdev_ops atm_ops = { + .open = ns_open, + .close = ns_close, + .ioctl = ns_ioctl, + .send = ns_send, + .phy_put = ns_phy_put, + .phy_get = ns_phy_get, + .proc_read = ns_proc_read, + .owner = THIS_MODULE, }; + static struct timer_list ns_timer; static char *mac[NS_MAX_CARDS]; module_param_array(mac, charp, NULL, 0); MODULE_LICENSE("GPL"); +/* Functions */ -/* Functions*******************************************************************/ - -static int __devinit nicstar_init_one(struct pci_dev *pcidev, - const struct pci_device_id *ent) +static int nicstar_init_one(struct pci_dev *pcidev, + const struct pci_device_id *ent) { - static int index = -1; - unsigned int error; + static int index = -1; + unsigned int error; - index++; - cards[index] = NULL; + index++; + cards[index] = NULL; - error = ns_init_card(index, pcidev); - if (error) { - cards[index--] = NULL; /* don't increment index */ - goto err_out; - } + error = ns_init_card(index, pcidev); + if (error) { + cards[index--] = NULL; /* don't increment index */ + goto err_out; + } - return 0; + return 0; err_out: - return -ENODEV; + return -ENODEV; } - - -static void __devexit nicstar_remove_one(struct pci_dev *pcidev) +static void nicstar_remove_one(struct pci_dev *pcidev) { - int i, j; - ns_dev *card = pci_get_drvdata(pcidev); - struct sk_buff *hb; - struct sk_buff *iovb; - struct sk_buff *lb; - struct sk_buff *sb; - - i = card->index; - - if (cards[i] == NULL) - return; - - if (card->atmdev->phy && card->atmdev->phy->stop) - card->atmdev->phy->stop(card->atmdev); - - /* Stop everything */ - writel(0x00000000, card->membase + CFG); - - /* De-register device */ - atm_dev_deregister(card->atmdev); - - /* Disable PCI device */ - pci_disable_device(pcidev); - - /* Free up resources */ - j = 0; - PRINTK("nicstar%d: freeing %d huge buffers.\n", i, card->hbpool.count); - while ((hb = skb_dequeue(&card->hbpool.queue)) != NULL) - { - dev_kfree_skb_any(hb); - j++; - } - PRINTK("nicstar%d: %d huge buffers freed.\n", i, j); - j = 0; - PRINTK("nicstar%d: freeing %d iovec buffers.\n", i, card->iovpool.count); - while ((iovb = skb_dequeue(&card->iovpool.queue)) != NULL) - { - dev_kfree_skb_any(iovb); - j++; - } - PRINTK("nicstar%d: %d iovec buffers freed.\n", i, j); - while ((lb = skb_dequeue(&card->lbpool.queue)) != NULL) - dev_kfree_skb_any(lb); - while ((sb = skb_dequeue(&card->sbpool.queue)) != NULL) - dev_kfree_skb_any(sb); - free_scq(card->scq0, NULL); - for (j = 0; j < NS_FRSCD_NUM; j++) - { - if (card->scd2vc[j] != NULL) - free_scq(card->scd2vc[j]->scq, card->scd2vc[j]->tx_vcc); - } - kfree(card->rsq.org); - kfree(card->tsq.org); - free_irq(card->pcidev->irq, card); - iounmap(card->membase); - kfree(card); + int i, j; + ns_dev *card = pci_get_drvdata(pcidev); + struct sk_buff *hb; + struct sk_buff *iovb; + struct sk_buff *lb; + struct sk_buff *sb; + + i = card->index; + + if (cards[i] == NULL) + return; + + if (card->atmdev->phy && card->atmdev->phy->stop) + card->atmdev->phy->stop(card->atmdev); + + /* Stop everything */ + writel(0x00000000, card->membase + CFG); + + /* De-register device */ + atm_dev_deregister(card->atmdev); + + /* Disable PCI device */ + pci_disable_device(pcidev); + + /* Free up resources */ + j = 0; + PRINTK("nicstar%d: freeing %d huge buffers.\n", i, card->hbpool.count); + while ((hb = skb_dequeue(&card->hbpool.queue)) != NULL) { + dev_kfree_skb_any(hb); + j++; + } + PRINTK("nicstar%d: %d huge buffers freed.\n", i, j); + j = 0; + PRINTK("nicstar%d: freeing %d iovec buffers.\n", i, + card->iovpool.count); + while ((iovb = skb_dequeue(&card->iovpool.queue)) != NULL) { + dev_kfree_skb_any(iovb); + j++; + } + PRINTK("nicstar%d: %d iovec buffers freed.\n", i, j); + while ((lb = skb_dequeue(&card->lbpool.queue)) != NULL) + dev_kfree_skb_any(lb); + while ((sb = skb_dequeue(&card->sbpool.queue)) != NULL) + dev_kfree_skb_any(sb); + free_scq(card, card->scq0, NULL); + for (j = 0; j < NS_FRSCD_NUM; j++) { + if (card->scd2vc[j] != NULL) + free_scq(card, card->scd2vc[j]->scq, card->scd2vc[j]->tx_vcc); + } + idr_destroy(&card->idr); + pci_free_consistent(card->pcidev, NS_RSQSIZE + NS_RSQ_ALIGNMENT, + card->rsq.org, card->rsq.dma); + pci_free_consistent(card->pcidev, NS_TSQSIZE + NS_TSQ_ALIGNMENT, + card->tsq.org, card->tsq.dma); + free_irq(card->pcidev->irq, card); + iounmap(card->membase); + kfree(card); } - - -static struct pci_device_id nicstar_pci_tbl[] __devinitdata = -{ - {PCI_VENDOR_ID_IDT, PCI_DEVICE_ID_IDT_IDT77201, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, +static struct pci_device_id nicstar_pci_tbl[] = { + { PCI_VDEVICE(IDT, PCI_DEVICE_ID_IDT_IDT77201), 0 }, {0,} /* terminate list */ }; -MODULE_DEVICE_TABLE(pci, nicstar_pci_tbl); - +MODULE_DEVICE_TABLE(pci, nicstar_pci_tbl); static struct pci_driver nicstar_driver = { - .name = "nicstar", - .id_table = nicstar_pci_tbl, - .probe = nicstar_init_one, - .remove = __devexit_p(nicstar_remove_one), + .name = "nicstar", + .id_table = nicstar_pci_tbl, + .probe = nicstar_init_one, + .remove = nicstar_remove_one, }; - - static int __init nicstar_init(void) { - unsigned error = 0; /* Initialized to remove compile warning */ + unsigned error = 0; /* Initialized to remove compile warning */ + + XPRINTK("nicstar: nicstar_init() called.\n"); - XPRINTK("nicstar: nicstar_init() called.\n"); + error = pci_register_driver(&nicstar_driver); - error = pci_register_driver(&nicstar_driver); - - TXPRINTK("nicstar: TX debug enabled.\n"); - RXPRINTK("nicstar: RX debug enabled.\n"); - PRINTK("nicstar: General debug enabled.\n"); + TXPRINTK("nicstar: TX debug enabled.\n"); + RXPRINTK("nicstar: RX debug enabled.\n"); + PRINTK("nicstar: General debug enabled.\n"); #ifdef PHY_LOOPBACK - printk("nicstar: using PHY loopback.\n"); + printk("nicstar: using PHY loopback.\n"); #endif /* PHY_LOOPBACK */ - XPRINTK("nicstar: nicstar_init() returned.\n"); - - if (!error) { - init_timer(&ns_timer); - ns_timer.expires = jiffies + NS_POLL_PERIOD; - ns_timer.data = 0UL; - ns_timer.function = ns_poll; - add_timer(&ns_timer); - } - - return error; -} + XPRINTK("nicstar: nicstar_init() returned.\n"); + if (!error) { + init_timer(&ns_timer); + ns_timer.expires = jiffies + NS_POLL_PERIOD; + ns_timer.data = 0UL; + ns_timer.function = ns_poll; + add_timer(&ns_timer); + } + return error; +} static void __exit nicstar_cleanup(void) { - XPRINTK("nicstar: nicstar_cleanup() called.\n"); + XPRINTK("nicstar: nicstar_cleanup() called.\n"); - del_timer(&ns_timer); + del_timer(&ns_timer); - pci_unregister_driver(&nicstar_driver); + pci_unregister_driver(&nicstar_driver); - XPRINTK("nicstar: nicstar_cleanup() returned.\n"); + XPRINTK("nicstar: nicstar_cleanup() returned.\n"); } - - -static u32 ns_read_sram(ns_dev *card, u32 sram_address) +static u32 ns_read_sram(ns_dev * card, u32 sram_address) { - unsigned long flags; - u32 data; - sram_address <<= 2; - sram_address &= 0x0007FFFC; /* address must be dword aligned */ - sram_address |= 0x50000000; /* SRAM read command */ - ns_grab_res_lock(card, flags); - while (CMD_BUSY(card)); - writel(sram_address, card->membase + CMD); - while (CMD_BUSY(card)); - data = readl(card->membase + DR0); - spin_unlock_irqrestore(&card->res_lock, flags); - return data; + unsigned long flags; + u32 data; + sram_address <<= 2; + sram_address &= 0x0007FFFC; /* address must be dword aligned */ + sram_address |= 0x50000000; /* SRAM read command */ + spin_lock_irqsave(&card->res_lock, flags); + while (CMD_BUSY(card)) ; + writel(sram_address, card->membase + CMD); + while (CMD_BUSY(card)) ; + data = readl(card->membase + DR0); + spin_unlock_irqrestore(&card->res_lock, flags); + return data; } - - -static void ns_write_sram(ns_dev *card, u32 sram_address, u32 *value, int count) +static void ns_write_sram(ns_dev * card, u32 sram_address, u32 * value, + int count) { - unsigned long flags; - int i, c; - count--; /* count range now is 0..3 instead of 1..4 */ - c = count; - c <<= 2; /* to use increments of 4 */ - ns_grab_res_lock(card, flags); - while (CMD_BUSY(card)); - for (i = 0; i <= c; i += 4) - writel(*(value++), card->membase + i); - /* Note: DR# registers are the first 4 dwords in nicstar's memspace, - so card->membase + DR0 == card->membase */ - sram_address <<= 2; - sram_address &= 0x0007FFFC; - sram_address |= (0x40000000 | count); - writel(sram_address, card->membase + CMD); - spin_unlock_irqrestore(&card->res_lock, flags); + unsigned long flags; + int i, c; + count--; /* count range now is 0..3 instead of 1..4 */ + c = count; + c <<= 2; /* to use increments of 4 */ + spin_lock_irqsave(&card->res_lock, flags); + while (CMD_BUSY(card)) ; + for (i = 0; i <= c; i += 4) + writel(*(value++), card->membase + i); + /* Note: DR# registers are the first 4 dwords in nicstar's memspace, + so card->membase + DR0 == card->membase */ + sram_address <<= 2; + sram_address &= 0x0007FFFC; + sram_address |= (0x40000000 | count); + writel(sram_address, card->membase + CMD); + spin_unlock_irqrestore(&card->res_lock, flags); } - -static int __devinit ns_init_card(int i, struct pci_dev *pcidev) +static int ns_init_card(int i, struct pci_dev *pcidev) { - int j; - struct ns_dev *card = NULL; - unsigned char pci_latency; - unsigned error; - u32 data; - u32 u32d[4]; - u32 ns_cfg_rctsize; - int bcount; - unsigned long membase; - - error = 0; - - if (pci_enable_device(pcidev)) - { - printk("nicstar%d: can't enable PCI device\n", i); - error = 2; - ns_init_card_error(card, error); - return error; - } - - if ((card = kmalloc(sizeof(ns_dev), GFP_KERNEL)) == NULL) - { - printk("nicstar%d: can't allocate memory for device structure.\n", i); - error = 2; - ns_init_card_error(card, error); - return error; - } - cards[i] = card; - spin_lock_init(&card->int_lock); - spin_lock_init(&card->res_lock); - - pci_set_drvdata(pcidev, card); - - card->index = i; - card->atmdev = NULL; - card->pcidev = pcidev; - membase = pci_resource_start(pcidev, 1); - card->membase = ioremap(membase, NS_IOREMAP_SIZE); - if (card->membase == 0) - { - printk("nicstar%d: can't ioremap() membase.\n",i); - error = 3; - ns_init_card_error(card, error); - return error; - } - PRINTK("nicstar%d: membase at 0x%x.\n", i, card->membase); - - pci_set_master(pcidev); - - if (pci_read_config_byte(pcidev, PCI_LATENCY_TIMER, &pci_latency) != 0) - { - printk("nicstar%d: can't read PCI latency timer.\n", i); - error = 6; - ns_init_card_error(card, error); - return error; - } + int j; + struct ns_dev *card = NULL; + unsigned char pci_latency; + unsigned error; + u32 data; + u32 u32d[4]; + u32 ns_cfg_rctsize; + int bcount; + unsigned long membase; + + error = 0; + + if (pci_enable_device(pcidev)) { + printk("nicstar%d: can't enable PCI device\n", i); + error = 2; + ns_init_card_error(card, error); + return error; + } + if ((pci_set_dma_mask(pcidev, DMA_BIT_MASK(32)) != 0) || + (pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(32)) != 0)) { + printk(KERN_WARNING + "nicstar%d: No suitable DMA available.\n", i); + error = 2; + ns_init_card_error(card, error); + return error; + } + + if ((card = kmalloc(sizeof(ns_dev), GFP_KERNEL)) == NULL) { + printk + ("nicstar%d: can't allocate memory for device structure.\n", + i); + error = 2; + ns_init_card_error(card, error); + return error; + } + cards[i] = card; + spin_lock_init(&card->int_lock); + spin_lock_init(&card->res_lock); + + pci_set_drvdata(pcidev, card); + + card->index = i; + card->atmdev = NULL; + card->pcidev = pcidev; + membase = pci_resource_start(pcidev, 1); + card->membase = ioremap(membase, NS_IOREMAP_SIZE); + if (!card->membase) { + printk("nicstar%d: can't ioremap() membase.\n", i); + error = 3; + ns_init_card_error(card, error); + return error; + } + PRINTK("nicstar%d: membase at 0x%p.\n", i, card->membase); + + pci_set_master(pcidev); + + if (pci_read_config_byte(pcidev, PCI_LATENCY_TIMER, &pci_latency) != 0) { + printk("nicstar%d: can't read PCI latency timer.\n", i); + error = 6; + ns_init_card_error(card, error); + return error; + } #ifdef NS_PCI_LATENCY - if (pci_latency < NS_PCI_LATENCY) - { - PRINTK("nicstar%d: setting PCI latency timer to %d.\n", i, NS_PCI_LATENCY); - for (j = 1; j < 4; j++) - { - if (pci_write_config_byte(pcidev, PCI_LATENCY_TIMER, NS_PCI_LATENCY) != 0) - break; - } - if (j == 4) - { - printk("nicstar%d: can't set PCI latency timer to %d.\n", i, NS_PCI_LATENCY); - error = 7; - ns_init_card_error(card, error); - return error; - } - } + if (pci_latency < NS_PCI_LATENCY) { + PRINTK("nicstar%d: setting PCI latency timer to %d.\n", i, + NS_PCI_LATENCY); + for (j = 1; j < 4; j++) { + if (pci_write_config_byte + (pcidev, PCI_LATENCY_TIMER, NS_PCI_LATENCY) != 0) + break; + } + if (j == 4) { + printk + ("nicstar%d: can't set PCI latency timer to %d.\n", + i, NS_PCI_LATENCY); + error = 7; + ns_init_card_error(card, error); + return error; + } + } #endif /* NS_PCI_LATENCY */ - - /* Clear timer overflow */ - data = readl(card->membase + STAT); - if (data & NS_STAT_TMROF) - writel(NS_STAT_TMROF, card->membase + STAT); - - /* Software reset */ - writel(NS_CFG_SWRST, card->membase + CFG); - NS_DELAY; - writel(0x00000000, card->membase + CFG); - - /* PHY reset */ - writel(0x00000008, card->membase + GP); - NS_DELAY; - writel(0x00000001, card->membase + GP); - NS_DELAY; - while (CMD_BUSY(card)); - writel(NS_CMD_WRITE_UTILITY | 0x00000100, card->membase + CMD); /* Sync UTOPIA with SAR clock */ - NS_DELAY; - - /* Detect PHY type */ - while (CMD_BUSY(card)); - writel(NS_CMD_READ_UTILITY | 0x00000200, card->membase + CMD); - while (CMD_BUSY(card)); - data = readl(card->membase + DR0); - switch(data) { - case 0x00000009: - printk("nicstar%d: PHY seems to be 25 Mbps.\n", i); - card->max_pcr = ATM_25_PCR; - while(CMD_BUSY(card)); - writel(0x00000008, card->membase + DR0); - writel(NS_CMD_WRITE_UTILITY | 0x00000200, card->membase + CMD); - /* Clear an eventual pending interrupt */ - writel(NS_STAT_SFBQF, card->membase + STAT); + + /* Clear timer overflow */ + data = readl(card->membase + STAT); + if (data & NS_STAT_TMROF) + writel(NS_STAT_TMROF, card->membase + STAT); + + /* Software reset */ + writel(NS_CFG_SWRST, card->membase + CFG); + NS_DELAY; + writel(0x00000000, card->membase + CFG); + + /* PHY reset */ + writel(0x00000008, card->membase + GP); + NS_DELAY; + writel(0x00000001, card->membase + GP); + NS_DELAY; + while (CMD_BUSY(card)) ; + writel(NS_CMD_WRITE_UTILITY | 0x00000100, card->membase + CMD); /* Sync UTOPIA with SAR clock */ + NS_DELAY; + + /* Detect PHY type */ + while (CMD_BUSY(card)) ; + writel(NS_CMD_READ_UTILITY | 0x00000200, card->membase + CMD); + while (CMD_BUSY(card)) ; + data = readl(card->membase + DR0); + switch (data) { + case 0x00000009: + printk("nicstar%d: PHY seems to be 25 Mbps.\n", i); + card->max_pcr = ATM_25_PCR; + while (CMD_BUSY(card)) ; + writel(0x00000008, card->membase + DR0); + writel(NS_CMD_WRITE_UTILITY | 0x00000200, card->membase + CMD); + /* Clear an eventual pending interrupt */ + writel(NS_STAT_SFBQF, card->membase + STAT); #ifdef PHY_LOOPBACK - while(CMD_BUSY(card)); - writel(0x00000022, card->membase + DR0); - writel(NS_CMD_WRITE_UTILITY | 0x00000202, card->membase + CMD); + while (CMD_BUSY(card)) ; + writel(0x00000022, card->membase + DR0); + writel(NS_CMD_WRITE_UTILITY | 0x00000202, card->membase + CMD); #endif /* PHY_LOOPBACK */ - break; - case 0x00000030: - case 0x00000031: - printk("nicstar%d: PHY seems to be 155 Mbps.\n", i); - card->max_pcr = ATM_OC3_PCR; + break; + case 0x00000030: + case 0x00000031: + printk("nicstar%d: PHY seems to be 155 Mbps.\n", i); + card->max_pcr = ATM_OC3_PCR; #ifdef PHY_LOOPBACK - while(CMD_BUSY(card)); - writel(0x00000002, card->membase + DR0); - writel(NS_CMD_WRITE_UTILITY | 0x00000205, card->membase + CMD); + while (CMD_BUSY(card)) ; + writel(0x00000002, card->membase + DR0); + writel(NS_CMD_WRITE_UTILITY | 0x00000205, card->membase + CMD); #endif /* PHY_LOOPBACK */ - break; - default: - printk("nicstar%d: unknown PHY type (0x%08X).\n", i, data); - error = 8; - ns_init_card_error(card, error); - return error; - } - writel(0x00000000, card->membase + GP); - - /* Determine SRAM size */ - data = 0x76543210; - ns_write_sram(card, 0x1C003, &data, 1); - data = 0x89ABCDEF; - ns_write_sram(card, 0x14003, &data, 1); - if (ns_read_sram(card, 0x14003) == 0x89ABCDEF && - ns_read_sram(card, 0x1C003) == 0x76543210) - card->sram_size = 128; - else - card->sram_size = 32; - PRINTK("nicstar%d: %dK x 32bit SRAM size.\n", i, card->sram_size); - - card->rct_size = NS_MAX_RCTSIZE; + break; + default: + printk("nicstar%d: unknown PHY type (0x%08X).\n", i, data); + error = 8; + ns_init_card_error(card, error); + return error; + } + writel(0x00000000, card->membase + GP); + + /* Determine SRAM size */ + data = 0x76543210; + ns_write_sram(card, 0x1C003, &data, 1); + data = 0x89ABCDEF; + ns_write_sram(card, 0x14003, &data, 1); + if (ns_read_sram(card, 0x14003) == 0x89ABCDEF && + ns_read_sram(card, 0x1C003) == 0x76543210) + card->sram_size = 128; + else + card->sram_size = 32; + PRINTK("nicstar%d: %dK x 32bit SRAM size.\n", i, card->sram_size); + + card->rct_size = NS_MAX_RCTSIZE; #if (NS_MAX_RCTSIZE == 4096) - if (card->sram_size == 128) - printk("nicstar%d: limiting maximum VCI. See NS_MAX_RCTSIZE in nicstar.h\n", i); + if (card->sram_size == 128) + printk + ("nicstar%d: limiting maximum VCI. See NS_MAX_RCTSIZE in nicstar.h\n", + i); #elif (NS_MAX_RCTSIZE == 16384) - if (card->sram_size == 32) - { - printk("nicstar%d: wasting memory. See NS_MAX_RCTSIZE in nicstar.h\n", i); - card->rct_size = 4096; - } + if (card->sram_size == 32) { + printk + ("nicstar%d: wasting memory. See NS_MAX_RCTSIZE in nicstar.h\n", + i); + card->rct_size = 4096; + } #else #error NS_MAX_RCTSIZE must be either 4096 or 16384 in nicstar.c #endif - card->vpibits = NS_VPIBITS; - if (card->rct_size == 4096) - card->vcibits = 12 - NS_VPIBITS; - else /* card->rct_size == 16384 */ - card->vcibits = 14 - NS_VPIBITS; - - /* Initialize the nicstar eeprom/eprom stuff, for the MAC addr */ - if (mac[i] == NULL) - nicstar_init_eprom(card->membase); - - /* Set the VPI/VCI MSb mask to zero so we can receive OAM cells */ - writel(0x00000000, card->membase + VPM); - - /* Initialize TSQ */ - card->tsq.org = kmalloc(NS_TSQSIZE + NS_TSQ_ALIGNMENT, GFP_KERNEL); - if (card->tsq.org == NULL) - { - printk("nicstar%d: can't allocate TSQ.\n", i); - error = 10; - ns_init_card_error(card, error); - return error; - } - card->tsq.base = (ns_tsi *) ALIGN_ADDRESS(card->tsq.org, NS_TSQ_ALIGNMENT); - card->tsq.next = card->tsq.base; - card->tsq.last = card->tsq.base + (NS_TSQ_NUM_ENTRIES - 1); - for (j = 0; j < NS_TSQ_NUM_ENTRIES; j++) - ns_tsi_init(card->tsq.base + j); - writel(0x00000000, card->membase + TSQH); - writel((u32) virt_to_bus(card->tsq.base), card->membase + TSQB); - PRINTK("nicstar%d: TSQ base at 0x%x 0x%x 0x%x.\n", i, (u32) card->tsq.base, - (u32) virt_to_bus(card->tsq.base), readl(card->membase + TSQB)); - - /* Initialize RSQ */ - card->rsq.org = kmalloc(NS_RSQSIZE + NS_RSQ_ALIGNMENT, GFP_KERNEL); - if (card->rsq.org == NULL) - { - printk("nicstar%d: can't allocate RSQ.\n", i); - error = 11; - ns_init_card_error(card, error); - return error; - } - card->rsq.base = (ns_rsqe *) ALIGN_ADDRESS(card->rsq.org, NS_RSQ_ALIGNMENT); - card->rsq.next = card->rsq.base; - card->rsq.last = card->rsq.base + (NS_RSQ_NUM_ENTRIES - 1); - for (j = 0; j < NS_RSQ_NUM_ENTRIES; j++) - ns_rsqe_init(card->rsq.base + j); - writel(0x00000000, card->membase + RSQH); - writel((u32) virt_to_bus(card->rsq.base), card->membase + RSQB); - PRINTK("nicstar%d: RSQ base at 0x%x.\n", i, (u32) card->rsq.base); - - /* Initialize SCQ0, the only VBR SCQ used */ - card->scq1 = NULL; - card->scq2 = NULL; - card->scq0 = get_scq(VBR_SCQSIZE, NS_VRSCD0); - if (card->scq0 == NULL) - { - printk("nicstar%d: can't get SCQ0.\n", i); - error = 12; - ns_init_card_error(card, error); - return error; - } - u32d[0] = (u32) virt_to_bus(card->scq0->base); - u32d[1] = (u32) 0x00000000; - u32d[2] = (u32) 0xffffffff; - u32d[3] = (u32) 0x00000000; - ns_write_sram(card, NS_VRSCD0, u32d, 4); - ns_write_sram(card, NS_VRSCD1, u32d, 4); /* These last two won't be used */ - ns_write_sram(card, NS_VRSCD2, u32d, 4); /* but are initialized, just in case... */ - card->scq0->scd = NS_VRSCD0; - PRINTK("nicstar%d: VBR-SCQ0 base at 0x%x.\n", i, (u32) card->scq0->base); - - /* Initialize TSTs */ - card->tst_addr = NS_TST0; - card->tst_free_entries = NS_TST_NUM_ENTRIES; - data = NS_TST_OPCODE_VARIABLE; - for (j = 0; j < NS_TST_NUM_ENTRIES; j++) - ns_write_sram(card, NS_TST0 + j, &data, 1); - data = ns_tste_make(NS_TST_OPCODE_END, NS_TST0); - ns_write_sram(card, NS_TST0 + NS_TST_NUM_ENTRIES, &data, 1); - for (j = 0; j < NS_TST_NUM_ENTRIES; j++) - ns_write_sram(card, NS_TST1 + j, &data, 1); - data = ns_tste_make(NS_TST_OPCODE_END, NS_TST1); - ns_write_sram(card, NS_TST1 + NS_TST_NUM_ENTRIES, &data, 1); - for (j = 0; j < NS_TST_NUM_ENTRIES; j++) - card->tste2vc[j] = NULL; - writel(NS_TST0 << 2, card->membase + TSTB); - - - /* Initialize RCT. AAL type is set on opening the VC. */ + card->vpibits = NS_VPIBITS; + if (card->rct_size == 4096) + card->vcibits = 12 - NS_VPIBITS; + else /* card->rct_size == 16384 */ + card->vcibits = 14 - NS_VPIBITS; + + /* Initialize the nicstar eeprom/eprom stuff, for the MAC addr */ + if (mac[i] == NULL) + nicstar_init_eprom(card->membase); + + /* Set the VPI/VCI MSb mask to zero so we can receive OAM cells */ + writel(0x00000000, card->membase + VPM); + + /* Initialize TSQ */ + card->tsq.org = pci_alloc_consistent(card->pcidev, + NS_TSQSIZE + NS_TSQ_ALIGNMENT, + &card->tsq.dma); + if (card->tsq.org == NULL) { + printk("nicstar%d: can't allocate TSQ.\n", i); + error = 10; + ns_init_card_error(card, error); + return error; + } + card->tsq.base = PTR_ALIGN(card->tsq.org, NS_TSQ_ALIGNMENT); + card->tsq.next = card->tsq.base; + card->tsq.last = card->tsq.base + (NS_TSQ_NUM_ENTRIES - 1); + for (j = 0; j < NS_TSQ_NUM_ENTRIES; j++) + ns_tsi_init(card->tsq.base + j); + writel(0x00000000, card->membase + TSQH); + writel(ALIGN(card->tsq.dma, NS_TSQ_ALIGNMENT), card->membase + TSQB); + PRINTK("nicstar%d: TSQ base at 0x%p.\n", i, card->tsq.base); + + /* Initialize RSQ */ + card->rsq.org = pci_alloc_consistent(card->pcidev, + NS_RSQSIZE + NS_RSQ_ALIGNMENT, + &card->rsq.dma); + if (card->rsq.org == NULL) { + printk("nicstar%d: can't allocate RSQ.\n", i); + error = 11; + ns_init_card_error(card, error); + return error; + } + card->rsq.base = PTR_ALIGN(card->rsq.org, NS_RSQ_ALIGNMENT); + card->rsq.next = card->rsq.base; + card->rsq.last = card->rsq.base + (NS_RSQ_NUM_ENTRIES - 1); + for (j = 0; j < NS_RSQ_NUM_ENTRIES; j++) + ns_rsqe_init(card->rsq.base + j); + writel(0x00000000, card->membase + RSQH); + writel(ALIGN(card->rsq.dma, NS_RSQ_ALIGNMENT), card->membase + RSQB); + PRINTK("nicstar%d: RSQ base at 0x%p.\n", i, card->rsq.base); + + /* Initialize SCQ0, the only VBR SCQ used */ + card->scq1 = NULL; + card->scq2 = NULL; + card->scq0 = get_scq(card, VBR_SCQSIZE, NS_VRSCD0); + if (card->scq0 == NULL) { + printk("nicstar%d: can't get SCQ0.\n", i); + error = 12; + ns_init_card_error(card, error); + return error; + } + u32d[0] = scq_virt_to_bus(card->scq0, card->scq0->base); + u32d[1] = (u32) 0x00000000; + u32d[2] = (u32) 0xffffffff; + u32d[3] = (u32) 0x00000000; + ns_write_sram(card, NS_VRSCD0, u32d, 4); + ns_write_sram(card, NS_VRSCD1, u32d, 4); /* These last two won't be used */ + ns_write_sram(card, NS_VRSCD2, u32d, 4); /* but are initialized, just in case... */ + card->scq0->scd = NS_VRSCD0; + PRINTK("nicstar%d: VBR-SCQ0 base at 0x%p.\n", i, card->scq0->base); + + /* Initialize TSTs */ + card->tst_addr = NS_TST0; + card->tst_free_entries = NS_TST_NUM_ENTRIES; + data = NS_TST_OPCODE_VARIABLE; + for (j = 0; j < NS_TST_NUM_ENTRIES; j++) + ns_write_sram(card, NS_TST0 + j, &data, 1); + data = ns_tste_make(NS_TST_OPCODE_END, NS_TST0); + ns_write_sram(card, NS_TST0 + NS_TST_NUM_ENTRIES, &data, 1); + for (j = 0; j < NS_TST_NUM_ENTRIES; j++) + ns_write_sram(card, NS_TST1 + j, &data, 1); + data = ns_tste_make(NS_TST_OPCODE_END, NS_TST1); + ns_write_sram(card, NS_TST1 + NS_TST_NUM_ENTRIES, &data, 1); + for (j = 0; j < NS_TST_NUM_ENTRIES; j++) + card->tste2vc[j] = NULL; + writel(NS_TST0 << 2, card->membase + TSTB); + + /* Initialize RCT. AAL type is set on opening the VC. */ #ifdef RCQ_SUPPORT - u32d[0] = NS_RCTE_RAWCELLINTEN; + u32d[0] = NS_RCTE_RAWCELLINTEN; #else - u32d[0] = 0x00000000; + u32d[0] = 0x00000000; #endif /* RCQ_SUPPORT */ - u32d[1] = 0x00000000; - u32d[2] = 0x00000000; - u32d[3] = 0xFFFFFFFF; - for (j = 0; j < card->rct_size; j++) - ns_write_sram(card, j * 4, u32d, 4); - - memset(card->vcmap, 0, NS_MAX_RCTSIZE * sizeof(vc_map)); - - for (j = 0; j < NS_FRSCD_NUM; j++) - card->scd2vc[j] = NULL; - - /* Initialize buffer levels */ - card->sbnr.min = MIN_SB; - card->sbnr.init = NUM_SB; - card->sbnr.max = MAX_SB; - card->lbnr.min = MIN_LB; - card->lbnr.init = NUM_LB; - card->lbnr.max = MAX_LB; - card->iovnr.min = MIN_IOVB; - card->iovnr.init = NUM_IOVB; - card->iovnr.max = MAX_IOVB; - card->hbnr.min = MIN_HB; - card->hbnr.init = NUM_HB; - card->hbnr.max = MAX_HB; - - card->sm_handle = 0x00000000; - card->sm_addr = 0x00000000; - card->lg_handle = 0x00000000; - card->lg_addr = 0x00000000; - - card->efbie = 1; /* To prevent push_rxbufs from enabling the interrupt */ - - /* Pre-allocate some huge buffers */ - skb_queue_head_init(&card->hbpool.queue); - card->hbpool.count = 0; - for (j = 0; j < NUM_HB; j++) - { - struct sk_buff *hb; - hb = __dev_alloc_skb(NS_HBUFSIZE, GFP_KERNEL); - if (hb == NULL) - { - printk("nicstar%d: can't allocate %dth of %d huge buffers.\n", - i, j, NUM_HB); - error = 13; - ns_init_card_error(card, error); - return error; - } - NS_SKB_CB(hb)->buf_type = BUF_NONE; - skb_queue_tail(&card->hbpool.queue, hb); - card->hbpool.count++; - } - - - /* Allocate large buffers */ - skb_queue_head_init(&card->lbpool.queue); - card->lbpool.count = 0; /* Not used */ - for (j = 0; j < NUM_LB; j++) - { - struct sk_buff *lb; - lb = __dev_alloc_skb(NS_LGSKBSIZE, GFP_KERNEL); - if (lb == NULL) - { - printk("nicstar%d: can't allocate %dth of %d large buffers.\n", - i, j, NUM_LB); - error = 14; - ns_init_card_error(card, error); - return error; - } - NS_SKB_CB(lb)->buf_type = BUF_LG; - skb_queue_tail(&card->lbpool.queue, lb); - skb_reserve(lb, NS_SMBUFSIZE); - push_rxbufs(card, lb); - /* Due to the implementation of push_rxbufs() this is 1, not 0 */ - if (j == 1) - { - card->rcbuf = lb; - card->rawch = (u32) virt_to_bus(lb->data); - } - } - /* Test for strange behaviour which leads to crashes */ - if ((bcount = ns_stat_lfbqc_get(readl(card->membase + STAT))) < card->lbnr.min) - { - printk("nicstar%d: Strange... Just allocated %d large buffers and lfbqc = %d.\n", - i, j, bcount); - error = 14; - ns_init_card_error(card, error); - return error; - } - - - /* Allocate small buffers */ - skb_queue_head_init(&card->sbpool.queue); - card->sbpool.count = 0; /* Not used */ - for (j = 0; j < NUM_SB; j++) - { - struct sk_buff *sb; - sb = __dev_alloc_skb(NS_SMSKBSIZE, GFP_KERNEL); - if (sb == NULL) - { - printk("nicstar%d: can't allocate %dth of %d small buffers.\n", - i, j, NUM_SB); - error = 15; - ns_init_card_error(card, error); - return error; - } - NS_SKB_CB(sb)->buf_type = BUF_SM; - skb_queue_tail(&card->sbpool.queue, sb); - skb_reserve(sb, NS_AAL0_HEADER); - push_rxbufs(card, sb); - } - /* Test for strange behaviour which leads to crashes */ - if ((bcount = ns_stat_sfbqc_get(readl(card->membase + STAT))) < card->sbnr.min) - { - printk("nicstar%d: Strange... Just allocated %d small buffers and sfbqc = %d.\n", - i, j, bcount); - error = 15; - ns_init_card_error(card, error); - return error; - } - - - /* Allocate iovec buffers */ - skb_queue_head_init(&card->iovpool.queue); - card->iovpool.count = 0; - for (j = 0; j < NUM_IOVB; j++) - { - struct sk_buff *iovb; - iovb = alloc_skb(NS_IOVBUFSIZE, GFP_KERNEL); - if (iovb == NULL) - { - printk("nicstar%d: can't allocate %dth of %d iovec buffers.\n", - i, j, NUM_IOVB); - error = 16; - ns_init_card_error(card, error); - return error; - } - NS_SKB_CB(iovb)->buf_type = BUF_NONE; - skb_queue_tail(&card->iovpool.queue, iovb); - card->iovpool.count++; - } - - /* Configure NICStAR */ - if (card->rct_size == 4096) - ns_cfg_rctsize = NS_CFG_RCTSIZE_4096_ENTRIES; - else /* (card->rct_size == 16384) */ - ns_cfg_rctsize = NS_CFG_RCTSIZE_16384_ENTRIES; - - card->efbie = 1; - - card->intcnt = 0; - if (request_irq(pcidev->irq, &ns_irq_handler, IRQF_DISABLED | IRQF_SHARED, "nicstar", card) != 0) - { - printk("nicstar%d: can't allocate IRQ %d.\n", i, pcidev->irq); - error = 9; - ns_init_card_error(card, error); - return error; - } - - /* Register device */ - card->atmdev = atm_dev_register("nicstar", &atm_ops, -1, NULL); - if (card->atmdev == NULL) - { - printk("nicstar%d: can't register device.\n", i); - error = 17; - ns_init_card_error(card, error); - return error; - } - - if (ns_parse_mac(mac[i], card->atmdev->esi)) { - nicstar_read_eprom(card->membase, NICSTAR_EPROM_MAC_ADDR_OFFSET, - card->atmdev->esi, 6); - if (memcmp(card->atmdev->esi, "\x00\x00\x00\x00\x00\x00", 6) == 0) { - nicstar_read_eprom(card->membase, NICSTAR_EPROM_MAC_ADDR_OFFSET_ALT, - card->atmdev->esi, 6); - } - } - - printk("nicstar%d: MAC address %02X:%02X:%02X:%02X:%02X:%02X\n", i, - card->atmdev->esi[0], card->atmdev->esi[1], card->atmdev->esi[2], - card->atmdev->esi[3], card->atmdev->esi[4], card->atmdev->esi[5]); - - card->atmdev->dev_data = card; - card->atmdev->ci_range.vpi_bits = card->vpibits; - card->atmdev->ci_range.vci_bits = card->vcibits; - card->atmdev->link_rate = card->max_pcr; - card->atmdev->phy = NULL; + u32d[1] = 0x00000000; + u32d[2] = 0x00000000; + u32d[3] = 0xFFFFFFFF; + for (j = 0; j < card->rct_size; j++) + ns_write_sram(card, j * 4, u32d, 4); + + memset(card->vcmap, 0, NS_MAX_RCTSIZE * sizeof(vc_map)); + + for (j = 0; j < NS_FRSCD_NUM; j++) + card->scd2vc[j] = NULL; + + /* Initialize buffer levels */ + card->sbnr.min = MIN_SB; + card->sbnr.init = NUM_SB; + card->sbnr.max = MAX_SB; + card->lbnr.min = MIN_LB; + card->lbnr.init = NUM_LB; + card->lbnr.max = MAX_LB; + card->iovnr.min = MIN_IOVB; + card->iovnr.init = NUM_IOVB; + card->iovnr.max = MAX_IOVB; + card->hbnr.min = MIN_HB; + card->hbnr.init = NUM_HB; + card->hbnr.max = MAX_HB; + + card->sm_handle = NULL; + card->sm_addr = 0x00000000; + card->lg_handle = NULL; + card->lg_addr = 0x00000000; + + card->efbie = 1; /* To prevent push_rxbufs from enabling the interrupt */ + + idr_init(&card->idr); + + /* Pre-allocate some huge buffers */ + skb_queue_head_init(&card->hbpool.queue); + card->hbpool.count = 0; + for (j = 0; j < NUM_HB; j++) { + struct sk_buff *hb; + hb = __dev_alloc_skb(NS_HBUFSIZE, GFP_KERNEL); + if (hb == NULL) { + printk + ("nicstar%d: can't allocate %dth of %d huge buffers.\n", + i, j, NUM_HB); + error = 13; + ns_init_card_error(card, error); + return error; + } + NS_PRV_BUFTYPE(hb) = BUF_NONE; + skb_queue_tail(&card->hbpool.queue, hb); + card->hbpool.count++; + } + + /* Allocate large buffers */ + skb_queue_head_init(&card->lbpool.queue); + card->lbpool.count = 0; /* Not used */ + for (j = 0; j < NUM_LB; j++) { + struct sk_buff *lb; + lb = __dev_alloc_skb(NS_LGSKBSIZE, GFP_KERNEL); + if (lb == NULL) { + printk + ("nicstar%d: can't allocate %dth of %d large buffers.\n", + i, j, NUM_LB); + error = 14; + ns_init_card_error(card, error); + return error; + } + NS_PRV_BUFTYPE(lb) = BUF_LG; + skb_queue_tail(&card->lbpool.queue, lb); + skb_reserve(lb, NS_SMBUFSIZE); + push_rxbufs(card, lb); + /* Due to the implementation of push_rxbufs() this is 1, not 0 */ + if (j == 1) { + card->rcbuf = lb; + card->rawcell = (struct ns_rcqe *) lb->data; + card->rawch = NS_PRV_DMA(lb); + } + } + /* Test for strange behaviour which leads to crashes */ + if ((bcount = + ns_stat_lfbqc_get(readl(card->membase + STAT))) < card->lbnr.min) { + printk + ("nicstar%d: Strange... Just allocated %d large buffers and lfbqc = %d.\n", + i, j, bcount); + error = 14; + ns_init_card_error(card, error); + return error; + } + + /* Allocate small buffers */ + skb_queue_head_init(&card->sbpool.queue); + card->sbpool.count = 0; /* Not used */ + for (j = 0; j < NUM_SB; j++) { + struct sk_buff *sb; + sb = __dev_alloc_skb(NS_SMSKBSIZE, GFP_KERNEL); + if (sb == NULL) { + printk + ("nicstar%d: can't allocate %dth of %d small buffers.\n", + i, j, NUM_SB); + error = 15; + ns_init_card_error(card, error); + return error; + } + NS_PRV_BUFTYPE(sb) = BUF_SM; + skb_queue_tail(&card->sbpool.queue, sb); + skb_reserve(sb, NS_AAL0_HEADER); + push_rxbufs(card, sb); + } + /* Test for strange behaviour which leads to crashes */ + if ((bcount = + ns_stat_sfbqc_get(readl(card->membase + STAT))) < card->sbnr.min) { + printk + ("nicstar%d: Strange... Just allocated %d small buffers and sfbqc = %d.\n", + i, j, bcount); + error = 15; + ns_init_card_error(card, error); + return error; + } + + /* Allocate iovec buffers */ + skb_queue_head_init(&card->iovpool.queue); + card->iovpool.count = 0; + for (j = 0; j < NUM_IOVB; j++) { + struct sk_buff *iovb; + iovb = alloc_skb(NS_IOVBUFSIZE, GFP_KERNEL); + if (iovb == NULL) { + printk + ("nicstar%d: can't allocate %dth of %d iovec buffers.\n", + i, j, NUM_IOVB); + error = 16; + ns_init_card_error(card, error); + return error; + } + NS_PRV_BUFTYPE(iovb) = BUF_NONE; + skb_queue_tail(&card->iovpool.queue, iovb); + card->iovpool.count++; + } + + /* Configure NICStAR */ + if (card->rct_size == 4096) + ns_cfg_rctsize = NS_CFG_RCTSIZE_4096_ENTRIES; + else /* (card->rct_size == 16384) */ + ns_cfg_rctsize = NS_CFG_RCTSIZE_16384_ENTRIES; + + card->efbie = 1; + + card->intcnt = 0; + if (request_irq + (pcidev->irq, &ns_irq_handler, IRQF_SHARED, "nicstar", card) != 0) { + printk("nicstar%d: can't allocate IRQ %d.\n", i, pcidev->irq); + error = 9; + ns_init_card_error(card, error); + return error; + } + + /* Register device */ + card->atmdev = atm_dev_register("nicstar", &card->pcidev->dev, &atm_ops, + -1, NULL); + if (card->atmdev == NULL) { + printk("nicstar%d: can't register device.\n", i); + error = 17; + ns_init_card_error(card, error); + return error; + } + + if (mac[i] == NULL || !mac_pton(mac[i], card->atmdev->esi)) { + nicstar_read_eprom(card->membase, NICSTAR_EPROM_MAC_ADDR_OFFSET, + card->atmdev->esi, 6); + if (ether_addr_equal(card->atmdev->esi, "\x00\x00\x00\x00\x00\x00")) { + nicstar_read_eprom(card->membase, + NICSTAR_EPROM_MAC_ADDR_OFFSET_ALT, + card->atmdev->esi, 6); + } + } + + printk("nicstar%d: MAC address %pM\n", i, card->atmdev->esi); + + card->atmdev->dev_data = card; + card->atmdev->ci_range.vpi_bits = card->vpibits; + card->atmdev->ci_range.vci_bits = card->vcibits; + card->atmdev->link_rate = card->max_pcr; + card->atmdev->phy = NULL; #ifdef CONFIG_ATM_NICSTAR_USE_SUNI - if (card->max_pcr == ATM_OC3_PCR) - suni_init(card->atmdev); + if (card->max_pcr == ATM_OC3_PCR) + suni_init(card->atmdev); #endif /* CONFIG_ATM_NICSTAR_USE_SUNI */ #ifdef CONFIG_ATM_NICSTAR_USE_IDT77105 - if (card->max_pcr == ATM_25_PCR) - idt77105_init(card->atmdev); + if (card->max_pcr == ATM_25_PCR) + idt77105_init(card->atmdev); #endif /* CONFIG_ATM_NICSTAR_USE_IDT77105 */ - if (card->atmdev->phy && card->atmdev->phy->start) - card->atmdev->phy->start(card->atmdev); - - writel(NS_CFG_RXPATH | - NS_CFG_SMBUFSIZE | - NS_CFG_LGBUFSIZE | - NS_CFG_EFBIE | - NS_CFG_RSQSIZE | - NS_CFG_VPIBITS | - ns_cfg_rctsize | - NS_CFG_RXINT_NODELAY | - NS_CFG_RAWIE | /* Only enabled if RCQ_SUPPORT */ - NS_CFG_RSQAFIE | - NS_CFG_TXEN | - NS_CFG_TXIE | - NS_CFG_TSQFIE_OPT | /* Only enabled if ENABLE_TSQFIE */ - NS_CFG_PHYIE, - card->membase + CFG); - - num_cards++; - - return error; -} + if (card->atmdev->phy && card->atmdev->phy->start) + card->atmdev->phy->start(card->atmdev); + writel(NS_CFG_RXPATH | NS_CFG_SMBUFSIZE | NS_CFG_LGBUFSIZE | NS_CFG_EFBIE | NS_CFG_RSQSIZE | NS_CFG_VPIBITS | ns_cfg_rctsize | NS_CFG_RXINT_NODELAY | NS_CFG_RAWIE | /* Only enabled if RCQ_SUPPORT */ + NS_CFG_RSQAFIE | NS_CFG_TXEN | NS_CFG_TXIE | NS_CFG_TSQFIE_OPT | /* Only enabled if ENABLE_TSQFIE */ + NS_CFG_PHYIE, card->membase + CFG); + num_cards++; -static void __devinit ns_init_card_error(ns_dev *card, int error) -{ - if (error >= 17) - { - writel(0x00000000, card->membase + CFG); - } - if (error >= 16) - { - struct sk_buff *iovb; - while ((iovb = skb_dequeue(&card->iovpool.queue)) != NULL) - dev_kfree_skb_any(iovb); - } - if (error >= 15) - { - struct sk_buff *sb; - while ((sb = skb_dequeue(&card->sbpool.queue)) != NULL) - dev_kfree_skb_any(sb); - free_scq(card->scq0, NULL); - } - if (error >= 14) - { - struct sk_buff *lb; - while ((lb = skb_dequeue(&card->lbpool.queue)) != NULL) - dev_kfree_skb_any(lb); - } - if (error >= 13) - { - struct sk_buff *hb; - while ((hb = skb_dequeue(&card->hbpool.queue)) != NULL) - dev_kfree_skb_any(hb); - } - if (error >= 12) - { - kfree(card->rsq.org); - } - if (error >= 11) - { - kfree(card->tsq.org); - } - if (error >= 10) - { - free_irq(card->pcidev->irq, card); - } - if (error >= 4) - { - iounmap(card->membase); - } - if (error >= 3) - { - pci_disable_device(card->pcidev); - kfree(card); - } + return error; } - - -static scq_info *get_scq(int size, u32 scd) +static void ns_init_card_error(ns_dev *card, int error) { - scq_info *scq; - int i; - - if (size != VBR_SCQSIZE && size != CBR_SCQSIZE) - return NULL; - - scq = kmalloc(sizeof(scq_info), GFP_KERNEL); - if (scq == NULL) - return NULL; - scq->org = kmalloc(2 * size, GFP_KERNEL); - if (scq->org == NULL) - { - kfree(scq); - return NULL; - } - scq->skb = kmalloc(sizeof(struct sk_buff *) * - (size / NS_SCQE_SIZE), GFP_KERNEL); - if (scq->skb == NULL) - { - kfree(scq->org); - kfree(scq); - return NULL; - } - scq->num_entries = size / NS_SCQE_SIZE; - scq->base = (ns_scqe *) ALIGN_ADDRESS(scq->org, size); - scq->next = scq->base; - scq->last = scq->base + (scq->num_entries - 1); - scq->tail = scq->last; - scq->scd = scd; - scq->num_entries = size / NS_SCQE_SIZE; - scq->tbd_count = 0; - init_waitqueue_head(&scq->scqfull_waitq); - scq->full = 0; - spin_lock_init(&scq->lock); - - for (i = 0; i < scq->num_entries; i++) - scq->skb[i] = NULL; - - return scq; + if (error >= 17) { + writel(0x00000000, card->membase + CFG); + } + if (error >= 16) { + struct sk_buff *iovb; + while ((iovb = skb_dequeue(&card->iovpool.queue)) != NULL) + dev_kfree_skb_any(iovb); + } + if (error >= 15) { + struct sk_buff *sb; + while ((sb = skb_dequeue(&card->sbpool.queue)) != NULL) + dev_kfree_skb_any(sb); + free_scq(card, card->scq0, NULL); + } + if (error >= 14) { + struct sk_buff *lb; + while ((lb = skb_dequeue(&card->lbpool.queue)) != NULL) + dev_kfree_skb_any(lb); + } + if (error >= 13) { + struct sk_buff *hb; + while ((hb = skb_dequeue(&card->hbpool.queue)) != NULL) + dev_kfree_skb_any(hb); + } + if (error >= 12) { + kfree(card->rsq.org); + } + if (error >= 11) { + kfree(card->tsq.org); + } + if (error >= 10) { + free_irq(card->pcidev->irq, card); + } + if (error >= 4) { + iounmap(card->membase); + } + if (error >= 3) { + pci_disable_device(card->pcidev); + kfree(card); + } } - +static scq_info *get_scq(ns_dev *card, int size, u32 scd) +{ + scq_info *scq; + int i; + + if (size != VBR_SCQSIZE && size != CBR_SCQSIZE) + return NULL; + + scq = kmalloc(sizeof(scq_info), GFP_KERNEL); + if (!scq) + return NULL; + scq->org = pci_alloc_consistent(card->pcidev, 2 * size, &scq->dma); + if (!scq->org) { + kfree(scq); + return NULL; + } + scq->skb = kmalloc(sizeof(struct sk_buff *) * + (size / NS_SCQE_SIZE), GFP_KERNEL); + if (!scq->skb) { + kfree(scq->org); + kfree(scq); + return NULL; + } + scq->num_entries = size / NS_SCQE_SIZE; + scq->base = PTR_ALIGN(scq->org, size); + scq->next = scq->base; + scq->last = scq->base + (scq->num_entries - 1); + scq->tail = scq->last; + scq->scd = scd; + scq->num_entries = size / NS_SCQE_SIZE; + scq->tbd_count = 0; + init_waitqueue_head(&scq->scqfull_waitq); + scq->full = 0; + spin_lock_init(&scq->lock); + + for (i = 0; i < scq->num_entries; i++) + scq->skb[i] = NULL; + + return scq; +} /* For variable rate SCQ vcc must be NULL */ -static void free_scq(scq_info *scq, struct atm_vcc *vcc) +static void free_scq(ns_dev *card, scq_info *scq, struct atm_vcc *vcc) { - int i; - - if (scq->num_entries == VBR_SCQ_NUM_ENTRIES) - for (i = 0; i < scq->num_entries; i++) - { - if (scq->skb[i] != NULL) - { - vcc = ATM_SKB(scq->skb[i])->vcc; - if (vcc->pop != NULL) - vcc->pop(vcc, scq->skb[i]); - else - dev_kfree_skb_any(scq->skb[i]); - } - } - else /* vcc must be != NULL */ - { - if (vcc == NULL) - { - printk("nicstar: free_scq() called with vcc == NULL for fixed rate scq."); - for (i = 0; i < scq->num_entries; i++) - dev_kfree_skb_any(scq->skb[i]); - } - else - for (i = 0; i < scq->num_entries; i++) - { - if (scq->skb[i] != NULL) - { - if (vcc->pop != NULL) - vcc->pop(vcc, scq->skb[i]); - else - dev_kfree_skb_any(scq->skb[i]); - } - } - } - kfree(scq->skb); - kfree(scq->org); - kfree(scq); + int i; + + if (scq->num_entries == VBR_SCQ_NUM_ENTRIES) + for (i = 0; i < scq->num_entries; i++) { + if (scq->skb[i] != NULL) { + vcc = ATM_SKB(scq->skb[i])->vcc; + if (vcc->pop != NULL) + vcc->pop(vcc, scq->skb[i]); + else + dev_kfree_skb_any(scq->skb[i]); + } + } else { /* vcc must be != NULL */ + + if (vcc == NULL) { + printk + ("nicstar: free_scq() called with vcc == NULL for fixed rate scq."); + for (i = 0; i < scq->num_entries; i++) + dev_kfree_skb_any(scq->skb[i]); + } else + for (i = 0; i < scq->num_entries; i++) { + if (scq->skb[i] != NULL) { + if (vcc->pop != NULL) + vcc->pop(vcc, scq->skb[i]); + else + dev_kfree_skb_any(scq->skb[i]); + } + } + } + kfree(scq->skb); + pci_free_consistent(card->pcidev, + 2 * (scq->num_entries == VBR_SCQ_NUM_ENTRIES ? + VBR_SCQSIZE : CBR_SCQSIZE), + scq->org, scq->dma); + kfree(scq); } - - /* The handles passed must be pointers to the sk_buff containing the small or large buffer(s) cast to u32. */ -static void push_rxbufs(ns_dev *card, struct sk_buff *skb) +static void push_rxbufs(ns_dev * card, struct sk_buff *skb) { - struct ns_skb_cb *cb = NS_SKB_CB(skb); - u32 handle1, addr1; - u32 handle2, addr2; - u32 stat; - unsigned long flags; - - /* *BARF* */ - handle2 = addr2 = 0; - handle1 = (u32)skb; - addr1 = (u32)virt_to_bus(skb->data); + struct sk_buff *handle1, *handle2; + int id1, id2; + u32 addr1, addr2; + u32 stat; + unsigned long flags; + + /* *BARF* */ + handle2 = NULL; + addr2 = 0; + handle1 = skb; + addr1 = pci_map_single(card->pcidev, + skb->data, + (NS_PRV_BUFTYPE(skb) == BUF_SM + ? NS_SMSKBSIZE : NS_LGSKBSIZE), + PCI_DMA_TODEVICE); + NS_PRV_DMA(skb) = addr1; /* save so we can unmap later */ #ifdef GENERAL_DEBUG - if (!addr1) - printk("nicstar%d: push_rxbufs called with addr1 = 0.\n", card->index); + if (!addr1) + printk("nicstar%d: push_rxbufs called with addr1 = 0.\n", + card->index); #endif /* GENERAL_DEBUG */ - stat = readl(card->membase + STAT); - card->sbfqc = ns_stat_sfbqc_get(stat); - card->lbfqc = ns_stat_lfbqc_get(stat); - if (cb->buf_type == BUF_SM) - { - if (!addr2) - { - if (card->sm_addr) - { - addr2 = card->sm_addr; - handle2 = card->sm_handle; - card->sm_addr = 0x00000000; - card->sm_handle = 0x00000000; - } - else /* (!sm_addr) */ - { - card->sm_addr = addr1; - card->sm_handle = handle1; - } - } - } - else /* buf_type == BUF_LG */ - { - if (!addr2) - { - if (card->lg_addr) - { - addr2 = card->lg_addr; - handle2 = card->lg_handle; - card->lg_addr = 0x00000000; - card->lg_handle = 0x00000000; - } - else /* (!lg_addr) */ - { - card->lg_addr = addr1; - card->lg_handle = handle1; - } - } - } - - if (addr2) - { - if (cb->buf_type == BUF_SM) - { - if (card->sbfqc >= card->sbnr.max) - { - skb_unlink((struct sk_buff *) handle1, &card->sbpool.queue); - dev_kfree_skb_any((struct sk_buff *) handle1); - skb_unlink((struct sk_buff *) handle2, &card->sbpool.queue); - dev_kfree_skb_any((struct sk_buff *) handle2); - return; - } - else - card->sbfqc += 2; - } - else /* (buf_type == BUF_LG) */ - { - if (card->lbfqc >= card->lbnr.max) - { - skb_unlink((struct sk_buff *) handle1, &card->lbpool.queue); - dev_kfree_skb_any((struct sk_buff *) handle1); - skb_unlink((struct sk_buff *) handle2, &card->lbpool.queue); - dev_kfree_skb_any((struct sk_buff *) handle2); - return; - } - else - card->lbfqc += 2; - } - - ns_grab_res_lock(card, flags); - - while (CMD_BUSY(card)); - writel(addr2, card->membase + DR3); - writel(handle2, card->membase + DR2); - writel(addr1, card->membase + DR1); - writel(handle1, card->membase + DR0); - writel(NS_CMD_WRITE_FREEBUFQ | cb->buf_type, card->membase + CMD); - - spin_unlock_irqrestore(&card->res_lock, flags); - - XPRINTK("nicstar%d: Pushing %s buffers at 0x%x and 0x%x.\n", card->index, - (cb->buf_type == BUF_SM ? "small" : "large"), addr1, addr2); - } - - if (!card->efbie && card->sbfqc >= card->sbnr.min && - card->lbfqc >= card->lbnr.min) - { - card->efbie = 1; - writel((readl(card->membase + CFG) | NS_CFG_EFBIE), card->membase + CFG); - } - - return; + stat = readl(card->membase + STAT); + card->sbfqc = ns_stat_sfbqc_get(stat); + card->lbfqc = ns_stat_lfbqc_get(stat); + if (NS_PRV_BUFTYPE(skb) == BUF_SM) { + if (!addr2) { + if (card->sm_addr) { + addr2 = card->sm_addr; + handle2 = card->sm_handle; + card->sm_addr = 0x00000000; + card->sm_handle = NULL; + } else { /* (!sm_addr) */ + + card->sm_addr = addr1; + card->sm_handle = handle1; + } + } + } else { /* buf_type == BUF_LG */ + + if (!addr2) { + if (card->lg_addr) { + addr2 = card->lg_addr; + handle2 = card->lg_handle; + card->lg_addr = 0x00000000; + card->lg_handle = NULL; + } else { /* (!lg_addr) */ + + card->lg_addr = addr1; + card->lg_handle = handle1; + } + } + } + + if (addr2) { + if (NS_PRV_BUFTYPE(skb) == BUF_SM) { + if (card->sbfqc >= card->sbnr.max) { + skb_unlink(handle1, &card->sbpool.queue); + dev_kfree_skb_any(handle1); + skb_unlink(handle2, &card->sbpool.queue); + dev_kfree_skb_any(handle2); + return; + } else + card->sbfqc += 2; + } else { /* (buf_type == BUF_LG) */ + + if (card->lbfqc >= card->lbnr.max) { + skb_unlink(handle1, &card->lbpool.queue); + dev_kfree_skb_any(handle1); + skb_unlink(handle2, &card->lbpool.queue); + dev_kfree_skb_any(handle2); + return; + } else + card->lbfqc += 2; + } + + id1 = idr_alloc(&card->idr, handle1, 0, 0, GFP_ATOMIC); + if (id1 < 0) + goto out; + + id2 = idr_alloc(&card->idr, handle2, 0, 0, GFP_ATOMIC); + if (id2 < 0) + goto out; + + spin_lock_irqsave(&card->res_lock, flags); + while (CMD_BUSY(card)) ; + writel(addr2, card->membase + DR3); + writel(id2, card->membase + DR2); + writel(addr1, card->membase + DR1); + writel(id1, card->membase + DR0); + writel(NS_CMD_WRITE_FREEBUFQ | NS_PRV_BUFTYPE(skb), + card->membase + CMD); + spin_unlock_irqrestore(&card->res_lock, flags); + + XPRINTK("nicstar%d: Pushing %s buffers at 0x%x and 0x%x.\n", + card->index, + (NS_PRV_BUFTYPE(skb) == BUF_SM ? "small" : "large"), + addr1, addr2); + } + + if (!card->efbie && card->sbfqc >= card->sbnr.min && + card->lbfqc >= card->lbnr.min) { + card->efbie = 1; + writel((readl(card->membase + CFG) | NS_CFG_EFBIE), + card->membase + CFG); + } + +out: + return; } - - static irqreturn_t ns_irq_handler(int irq, void *dev_id) { - u32 stat_r; - ns_dev *card; - struct atm_dev *dev; - unsigned long flags; - - card = (ns_dev *) dev_id; - dev = card->atmdev; - card->intcnt++; - - PRINTK("nicstar%d: NICStAR generated an interrupt\n", card->index); - - ns_grab_int_lock(card, flags); - - stat_r = readl(card->membase + STAT); - - /* Transmit Status Indicator has been written to T. S. Queue */ - if (stat_r & NS_STAT_TSIF) - { - TXPRINTK("nicstar%d: TSI interrupt\n", card->index); - process_tsq(card); - writel(NS_STAT_TSIF, card->membase + STAT); - } - - /* Incomplete CS-PDU has been transmitted */ - if (stat_r & NS_STAT_TXICP) - { - writel(NS_STAT_TXICP, card->membase + STAT); - TXPRINTK("nicstar%d: Incomplete CS-PDU transmitted.\n", - card->index); - } - - /* Transmit Status Queue 7/8 full */ - if (stat_r & NS_STAT_TSQF) - { - writel(NS_STAT_TSQF, card->membase + STAT); - PRINTK("nicstar%d: TSQ full.\n", card->index); - process_tsq(card); - } - - /* Timer overflow */ - if (stat_r & NS_STAT_TMROF) - { - writel(NS_STAT_TMROF, card->membase + STAT); - PRINTK("nicstar%d: Timer overflow.\n", card->index); - } - - /* PHY device interrupt signal active */ - if (stat_r & NS_STAT_PHYI) - { - writel(NS_STAT_PHYI, card->membase + STAT); - PRINTK("nicstar%d: PHY interrupt.\n", card->index); - if (dev->phy && dev->phy->interrupt) { - dev->phy->interrupt(dev); - } - } - - /* Small Buffer Queue is full */ - if (stat_r & NS_STAT_SFBQF) - { - writel(NS_STAT_SFBQF, card->membase + STAT); - printk("nicstar%d: Small free buffer queue is full.\n", card->index); - } - - /* Large Buffer Queue is full */ - if (stat_r & NS_STAT_LFBQF) - { - writel(NS_STAT_LFBQF, card->membase + STAT); - printk("nicstar%d: Large free buffer queue is full.\n", card->index); - } - - /* Receive Status Queue is full */ - if (stat_r & NS_STAT_RSQF) - { - writel(NS_STAT_RSQF, card->membase + STAT); - printk("nicstar%d: RSQ full.\n", card->index); - process_rsq(card); - } - - /* Complete CS-PDU received */ - if (stat_r & NS_STAT_EOPDU) - { - RXPRINTK("nicstar%d: End of CS-PDU received.\n", card->index); - process_rsq(card); - writel(NS_STAT_EOPDU, card->membase + STAT); - } - - /* Raw cell received */ - if (stat_r & NS_STAT_RAWCF) - { - writel(NS_STAT_RAWCF, card->membase + STAT); + u32 stat_r; + ns_dev *card; + struct atm_dev *dev; + unsigned long flags; + + card = (ns_dev *) dev_id; + dev = card->atmdev; + card->intcnt++; + + PRINTK("nicstar%d: NICStAR generated an interrupt\n", card->index); + + spin_lock_irqsave(&card->int_lock, flags); + + stat_r = readl(card->membase + STAT); + + /* Transmit Status Indicator has been written to T. S. Queue */ + if (stat_r & NS_STAT_TSIF) { + TXPRINTK("nicstar%d: TSI interrupt\n", card->index); + process_tsq(card); + writel(NS_STAT_TSIF, card->membase + STAT); + } + + /* Incomplete CS-PDU has been transmitted */ + if (stat_r & NS_STAT_TXICP) { + writel(NS_STAT_TXICP, card->membase + STAT); + TXPRINTK("nicstar%d: Incomplete CS-PDU transmitted.\n", + card->index); + } + + /* Transmit Status Queue 7/8 full */ + if (stat_r & NS_STAT_TSQF) { + writel(NS_STAT_TSQF, card->membase + STAT); + PRINTK("nicstar%d: TSQ full.\n", card->index); + process_tsq(card); + } + + /* Timer overflow */ + if (stat_r & NS_STAT_TMROF) { + writel(NS_STAT_TMROF, card->membase + STAT); + PRINTK("nicstar%d: Timer overflow.\n", card->index); + } + + /* PHY device interrupt signal active */ + if (stat_r & NS_STAT_PHYI) { + writel(NS_STAT_PHYI, card->membase + STAT); + PRINTK("nicstar%d: PHY interrupt.\n", card->index); + if (dev->phy && dev->phy->interrupt) { + dev->phy->interrupt(dev); + } + } + + /* Small Buffer Queue is full */ + if (stat_r & NS_STAT_SFBQF) { + writel(NS_STAT_SFBQF, card->membase + STAT); + printk("nicstar%d: Small free buffer queue is full.\n", + card->index); + } + + /* Large Buffer Queue is full */ + if (stat_r & NS_STAT_LFBQF) { + writel(NS_STAT_LFBQF, card->membase + STAT); + printk("nicstar%d: Large free buffer queue is full.\n", + card->index); + } + + /* Receive Status Queue is full */ + if (stat_r & NS_STAT_RSQF) { + writel(NS_STAT_RSQF, card->membase + STAT); + printk("nicstar%d: RSQ full.\n", card->index); + process_rsq(card); + } + + /* Complete CS-PDU received */ + if (stat_r & NS_STAT_EOPDU) { + RXPRINTK("nicstar%d: End of CS-PDU received.\n", card->index); + process_rsq(card); + writel(NS_STAT_EOPDU, card->membase + STAT); + } + + /* Raw cell received */ + if (stat_r & NS_STAT_RAWCF) { + writel(NS_STAT_RAWCF, card->membase + STAT); #ifndef RCQ_SUPPORT - printk("nicstar%d: Raw cell received and no support yet...\n", - card->index); + printk("nicstar%d: Raw cell received and no support yet...\n", + card->index); #endif /* RCQ_SUPPORT */ - /* NOTE: the following procedure may keep a raw cell pending until the - next interrupt. As this preliminary support is only meant to - avoid buffer leakage, this is not an issue. */ - while (readl(card->membase + RAWCT) != card->rawch) - { - ns_rcqe *rawcell; - - rawcell = (ns_rcqe *) bus_to_virt(card->rawch); - if (ns_rcqe_islast(rawcell)) - { - struct sk_buff *oldbuf; - - oldbuf = card->rcbuf; - card->rcbuf = (struct sk_buff *) ns_rcqe_nextbufhandle(rawcell); - card->rawch = (u32) virt_to_bus(card->rcbuf->data); - recycle_rx_buf(card, oldbuf); - } - else - card->rawch += NS_RCQE_SIZE; - } - } - - /* Small buffer queue is empty */ - if (stat_r & NS_STAT_SFBQE) - { - int i; - struct sk_buff *sb; - - writel(NS_STAT_SFBQE, card->membase + STAT); - printk("nicstar%d: Small free buffer queue empty.\n", - card->index); - for (i = 0; i < card->sbnr.min; i++) - { - sb = dev_alloc_skb(NS_SMSKBSIZE); - if (sb == NULL) - { - writel(readl(card->membase + CFG) & ~NS_CFG_EFBIE, card->membase + CFG); - card->efbie = 0; - break; - } - NS_SKB_CB(sb)->buf_type = BUF_SM; - skb_queue_tail(&card->sbpool.queue, sb); - skb_reserve(sb, NS_AAL0_HEADER); - push_rxbufs(card, sb); - } - card->sbfqc = i; - process_rsq(card); - } - - /* Large buffer queue empty */ - if (stat_r & NS_STAT_LFBQE) - { - int i; - struct sk_buff *lb; - - writel(NS_STAT_LFBQE, card->membase + STAT); - printk("nicstar%d: Large free buffer queue empty.\n", - card->index); - for (i = 0; i < card->lbnr.min; i++) - { - lb = dev_alloc_skb(NS_LGSKBSIZE); - if (lb == NULL) - { - writel(readl(card->membase + CFG) & ~NS_CFG_EFBIE, card->membase + CFG); - card->efbie = 0; - break; - } - NS_SKB_CB(lb)->buf_type = BUF_LG; - skb_queue_tail(&card->lbpool.queue, lb); - skb_reserve(lb, NS_SMBUFSIZE); - push_rxbufs(card, lb); - } - card->lbfqc = i; - process_rsq(card); - } - - /* Receive Status Queue is 7/8 full */ - if (stat_r & NS_STAT_RSQAF) - { - writel(NS_STAT_RSQAF, card->membase + STAT); - RXPRINTK("nicstar%d: RSQ almost full.\n", card->index); - process_rsq(card); - } - - spin_unlock_irqrestore(&card->int_lock, flags); - PRINTK("nicstar%d: end of interrupt service\n", card->index); - return IRQ_HANDLED; + /* NOTE: the following procedure may keep a raw cell pending until the + next interrupt. As this preliminary support is only meant to + avoid buffer leakage, this is not an issue. */ + while (readl(card->membase + RAWCT) != card->rawch) { + + if (ns_rcqe_islast(card->rawcell)) { + struct sk_buff *oldbuf; + + oldbuf = card->rcbuf; + card->rcbuf = idr_find(&card->idr, + ns_rcqe_nextbufhandle(card->rawcell)); + card->rawch = NS_PRV_DMA(card->rcbuf); + card->rawcell = (struct ns_rcqe *) + card->rcbuf->data; + recycle_rx_buf(card, oldbuf); + } else { + card->rawch += NS_RCQE_SIZE; + card->rawcell++; + } + } + } + + /* Small buffer queue is empty */ + if (stat_r & NS_STAT_SFBQE) { + int i; + struct sk_buff *sb; + + writel(NS_STAT_SFBQE, card->membase + STAT); + printk("nicstar%d: Small free buffer queue empty.\n", + card->index); + for (i = 0; i < card->sbnr.min; i++) { + sb = dev_alloc_skb(NS_SMSKBSIZE); + if (sb == NULL) { + writel(readl(card->membase + CFG) & + ~NS_CFG_EFBIE, card->membase + CFG); + card->efbie = 0; + break; + } + NS_PRV_BUFTYPE(sb) = BUF_SM; + skb_queue_tail(&card->sbpool.queue, sb); + skb_reserve(sb, NS_AAL0_HEADER); + push_rxbufs(card, sb); + } + card->sbfqc = i; + process_rsq(card); + } + + /* Large buffer queue empty */ + if (stat_r & NS_STAT_LFBQE) { + int i; + struct sk_buff *lb; + + writel(NS_STAT_LFBQE, card->membase + STAT); + printk("nicstar%d: Large free buffer queue empty.\n", + card->index); + for (i = 0; i < card->lbnr.min; i++) { + lb = dev_alloc_skb(NS_LGSKBSIZE); + if (lb == NULL) { + writel(readl(card->membase + CFG) & + ~NS_CFG_EFBIE, card->membase + CFG); + card->efbie = 0; + break; + } + NS_PRV_BUFTYPE(lb) = BUF_LG; + skb_queue_tail(&card->lbpool.queue, lb); + skb_reserve(lb, NS_SMBUFSIZE); + push_rxbufs(card, lb); + } + card->lbfqc = i; + process_rsq(card); + } + + /* Receive Status Queue is 7/8 full */ + if (stat_r & NS_STAT_RSQAF) { + writel(NS_STAT_RSQAF, card->membase + STAT); + RXPRINTK("nicstar%d: RSQ almost full.\n", card->index); + process_rsq(card); + } + + spin_unlock_irqrestore(&card->int_lock, flags); + PRINTK("nicstar%d: end of interrupt service\n", card->index); + return IRQ_HANDLED; } - - static int ns_open(struct atm_vcc *vcc) { - ns_dev *card; - vc_map *vc; - unsigned long tmpl, modl; - int tcr, tcra; /* target cell rate, and absolute value */ - int n = 0; /* Number of entries in the TST. Initialized to remove - the compiler warning. */ - u32 u32d[4]; - int frscdi = 0; /* Index of the SCD. Initialized to remove the compiler - warning. How I wish compilers were clever enough to - tell which variables can truly be used - uninitialized... */ - int inuse; /* tx or rx vc already in use by another vcc */ - short vpi = vcc->vpi; - int vci = vcc->vci; - - card = (ns_dev *) vcc->dev->dev_data; - PRINTK("nicstar%d: opening vpi.vci %d.%d \n", card->index, (int) vpi, vci); - if (vcc->qos.aal != ATM_AAL5 && vcc->qos.aal != ATM_AAL0) - { - PRINTK("nicstar%d: unsupported AAL.\n", card->index); - return -EINVAL; - } - - vc = &(card->vcmap[vpi << card->vcibits | vci]); - vcc->dev_data = vc; - - inuse = 0; - if (vcc->qos.txtp.traffic_class != ATM_NONE && vc->tx) - inuse = 1; - if (vcc->qos.rxtp.traffic_class != ATM_NONE && vc->rx) - inuse += 2; - if (inuse) - { - printk("nicstar%d: %s vci already in use.\n", card->index, - inuse == 1 ? "tx" : inuse == 2 ? "rx" : "tx and rx"); - return -EINVAL; - } - - set_bit(ATM_VF_ADDR,&vcc->flags); - - /* NOTE: You are not allowed to modify an open connection's QOS. To change - that, remove the ATM_VF_PARTIAL flag checking. There may be other changes - needed to do that. */ - if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) - { - scq_info *scq; - - set_bit(ATM_VF_PARTIAL,&vcc->flags); - if (vcc->qos.txtp.traffic_class == ATM_CBR) - { - /* Check requested cell rate and availability of SCD */ - if (vcc->qos.txtp.max_pcr == 0 && vcc->qos.txtp.pcr == 0 && - vcc->qos.txtp.min_pcr == 0) - { - PRINTK("nicstar%d: trying to open a CBR vc with cell rate = 0 \n", - card->index); - clear_bit(ATM_VF_PARTIAL,&vcc->flags); - clear_bit(ATM_VF_ADDR,&vcc->flags); - return -EINVAL; - } - - tcr = atm_pcr_goal(&(vcc->qos.txtp)); - tcra = tcr >= 0 ? tcr : -tcr; - - PRINTK("nicstar%d: target cell rate = %d.\n", card->index, - vcc->qos.txtp.max_pcr); - - tmpl = (unsigned long)tcra * (unsigned long)NS_TST_NUM_ENTRIES; - modl = tmpl % card->max_pcr; - - n = (int)(tmpl / card->max_pcr); - if (tcr > 0) - { - if (modl > 0) n++; - } - else if (tcr == 0) - { - if ((n = (card->tst_free_entries - NS_TST_RESERVED)) <= 0) - { - PRINTK("nicstar%d: no CBR bandwidth free.\n", card->index); - clear_bit(ATM_VF_PARTIAL,&vcc->flags); - clear_bit(ATM_VF_ADDR,&vcc->flags); - return -EINVAL; - } - } - - if (n == 0) - { - printk("nicstar%d: selected bandwidth < granularity.\n", card->index); - clear_bit(ATM_VF_PARTIAL,&vcc->flags); - clear_bit(ATM_VF_ADDR,&vcc->flags); - return -EINVAL; - } - - if (n > (card->tst_free_entries - NS_TST_RESERVED)) - { - PRINTK("nicstar%d: not enough free CBR bandwidth.\n", card->index); - clear_bit(ATM_VF_PARTIAL,&vcc->flags); - clear_bit(ATM_VF_ADDR,&vcc->flags); - return -EINVAL; - } - else - card->tst_free_entries -= n; - - XPRINTK("nicstar%d: writing %d tst entries.\n", card->index, n); - for (frscdi = 0; frscdi < NS_FRSCD_NUM; frscdi++) - { - if (card->scd2vc[frscdi] == NULL) - { - card->scd2vc[frscdi] = vc; - break; - } - } - if (frscdi == NS_FRSCD_NUM) - { - PRINTK("nicstar%d: no SCD available for CBR channel.\n", card->index); - card->tst_free_entries += n; - clear_bit(ATM_VF_PARTIAL,&vcc->flags); - clear_bit(ATM_VF_ADDR,&vcc->flags); - return -EBUSY; - } - - vc->cbr_scd = NS_FRSCD + frscdi * NS_FRSCD_SIZE; - - scq = get_scq(CBR_SCQSIZE, vc->cbr_scd); - if (scq == NULL) - { - PRINTK("nicstar%d: can't get fixed rate SCQ.\n", card->index); - card->scd2vc[frscdi] = NULL; - card->tst_free_entries += n; - clear_bit(ATM_VF_PARTIAL,&vcc->flags); - clear_bit(ATM_VF_ADDR,&vcc->flags); - return -ENOMEM; - } - vc->scq = scq; - u32d[0] = (u32) virt_to_bus(scq->base); - u32d[1] = (u32) 0x00000000; - u32d[2] = (u32) 0xffffffff; - u32d[3] = (u32) 0x00000000; - ns_write_sram(card, vc->cbr_scd, u32d, 4); - - fill_tst(card, n, vc); - } - else if (vcc->qos.txtp.traffic_class == ATM_UBR) - { - vc->cbr_scd = 0x00000000; - vc->scq = card->scq0; - } - - if (vcc->qos.txtp.traffic_class != ATM_NONE) - { - vc->tx = 1; - vc->tx_vcc = vcc; - vc->tbd_count = 0; - } - if (vcc->qos.rxtp.traffic_class != ATM_NONE) - { - u32 status; - - vc->rx = 1; - vc->rx_vcc = vcc; - vc->rx_iov = NULL; - - /* Open the connection in hardware */ - if (vcc->qos.aal == ATM_AAL5) - status = NS_RCTE_AAL5 | NS_RCTE_CONNECTOPEN; - else /* vcc->qos.aal == ATM_AAL0 */ - status = NS_RCTE_AAL0 | NS_RCTE_CONNECTOPEN; + ns_dev *card; + vc_map *vc; + unsigned long tmpl, modl; + int tcr, tcra; /* target cell rate, and absolute value */ + int n = 0; /* Number of entries in the TST. Initialized to remove + the compiler warning. */ + u32 u32d[4]; + int frscdi = 0; /* Index of the SCD. Initialized to remove the compiler + warning. How I wish compilers were clever enough to + tell which variables can truly be used + uninitialized... */ + int inuse; /* tx or rx vc already in use by another vcc */ + short vpi = vcc->vpi; + int vci = vcc->vci; + + card = (ns_dev *) vcc->dev->dev_data; + PRINTK("nicstar%d: opening vpi.vci %d.%d \n", card->index, (int)vpi, + vci); + if (vcc->qos.aal != ATM_AAL5 && vcc->qos.aal != ATM_AAL0) { + PRINTK("nicstar%d: unsupported AAL.\n", card->index); + return -EINVAL; + } + + vc = &(card->vcmap[vpi << card->vcibits | vci]); + vcc->dev_data = vc; + + inuse = 0; + if (vcc->qos.txtp.traffic_class != ATM_NONE && vc->tx) + inuse = 1; + if (vcc->qos.rxtp.traffic_class != ATM_NONE && vc->rx) + inuse += 2; + if (inuse) { + printk("nicstar%d: %s vci already in use.\n", card->index, + inuse == 1 ? "tx" : inuse == 2 ? "rx" : "tx and rx"); + return -EINVAL; + } + + set_bit(ATM_VF_ADDR, &vcc->flags); + + /* NOTE: You are not allowed to modify an open connection's QOS. To change + that, remove the ATM_VF_PARTIAL flag checking. There may be other changes + needed to do that. */ + if (!test_bit(ATM_VF_PARTIAL, &vcc->flags)) { + scq_info *scq; + + set_bit(ATM_VF_PARTIAL, &vcc->flags); + if (vcc->qos.txtp.traffic_class == ATM_CBR) { + /* Check requested cell rate and availability of SCD */ + if (vcc->qos.txtp.max_pcr == 0 && vcc->qos.txtp.pcr == 0 + && vcc->qos.txtp.min_pcr == 0) { + PRINTK + ("nicstar%d: trying to open a CBR vc with cell rate = 0 \n", + card->index); + clear_bit(ATM_VF_PARTIAL, &vcc->flags); + clear_bit(ATM_VF_ADDR, &vcc->flags); + return -EINVAL; + } + + tcr = atm_pcr_goal(&(vcc->qos.txtp)); + tcra = tcr >= 0 ? tcr : -tcr; + + PRINTK("nicstar%d: target cell rate = %d.\n", + card->index, vcc->qos.txtp.max_pcr); + + tmpl = + (unsigned long)tcra *(unsigned long) + NS_TST_NUM_ENTRIES; + modl = tmpl % card->max_pcr; + + n = (int)(tmpl / card->max_pcr); + if (tcr > 0) { + if (modl > 0) + n++; + } else if (tcr == 0) { + if ((n = + (card->tst_free_entries - + NS_TST_RESERVED)) <= 0) { + PRINTK + ("nicstar%d: no CBR bandwidth free.\n", + card->index); + clear_bit(ATM_VF_PARTIAL, &vcc->flags); + clear_bit(ATM_VF_ADDR, &vcc->flags); + return -EINVAL; + } + } + + if (n == 0) { + printk + ("nicstar%d: selected bandwidth < granularity.\n", + card->index); + clear_bit(ATM_VF_PARTIAL, &vcc->flags); + clear_bit(ATM_VF_ADDR, &vcc->flags); + return -EINVAL; + } + + if (n > (card->tst_free_entries - NS_TST_RESERVED)) { + PRINTK + ("nicstar%d: not enough free CBR bandwidth.\n", + card->index); + clear_bit(ATM_VF_PARTIAL, &vcc->flags); + clear_bit(ATM_VF_ADDR, &vcc->flags); + return -EINVAL; + } else + card->tst_free_entries -= n; + + XPRINTK("nicstar%d: writing %d tst entries.\n", + card->index, n); + for (frscdi = 0; frscdi < NS_FRSCD_NUM; frscdi++) { + if (card->scd2vc[frscdi] == NULL) { + card->scd2vc[frscdi] = vc; + break; + } + } + if (frscdi == NS_FRSCD_NUM) { + PRINTK + ("nicstar%d: no SCD available for CBR channel.\n", + card->index); + card->tst_free_entries += n; + clear_bit(ATM_VF_PARTIAL, &vcc->flags); + clear_bit(ATM_VF_ADDR, &vcc->flags); + return -EBUSY; + } + + vc->cbr_scd = NS_FRSCD + frscdi * NS_FRSCD_SIZE; + + scq = get_scq(card, CBR_SCQSIZE, vc->cbr_scd); + if (scq == NULL) { + PRINTK("nicstar%d: can't get fixed rate SCQ.\n", + card->index); + card->scd2vc[frscdi] = NULL; + card->tst_free_entries += n; + clear_bit(ATM_VF_PARTIAL, &vcc->flags); + clear_bit(ATM_VF_ADDR, &vcc->flags); + return -ENOMEM; + } + vc->scq = scq; + u32d[0] = scq_virt_to_bus(scq, scq->base); + u32d[1] = (u32) 0x00000000; + u32d[2] = (u32) 0xffffffff; + u32d[3] = (u32) 0x00000000; + ns_write_sram(card, vc->cbr_scd, u32d, 4); + + fill_tst(card, n, vc); + } else if (vcc->qos.txtp.traffic_class == ATM_UBR) { + vc->cbr_scd = 0x00000000; + vc->scq = card->scq0; + } + + if (vcc->qos.txtp.traffic_class != ATM_NONE) { + vc->tx = 1; + vc->tx_vcc = vcc; + vc->tbd_count = 0; + } + if (vcc->qos.rxtp.traffic_class != ATM_NONE) { + u32 status; + + vc->rx = 1; + vc->rx_vcc = vcc; + vc->rx_iov = NULL; + + /* Open the connection in hardware */ + if (vcc->qos.aal == ATM_AAL5) + status = NS_RCTE_AAL5 | NS_RCTE_CONNECTOPEN; + else /* vcc->qos.aal == ATM_AAL0 */ + status = NS_RCTE_AAL0 | NS_RCTE_CONNECTOPEN; #ifdef RCQ_SUPPORT - status |= NS_RCTE_RAWCELLINTEN; + status |= NS_RCTE_RAWCELLINTEN; #endif /* RCQ_SUPPORT */ - ns_write_sram(card, NS_RCT + (vpi << card->vcibits | vci) * - NS_RCT_ENTRY_SIZE, &status, 1); - } - - } - - set_bit(ATM_VF_READY,&vcc->flags); - return 0; -} + ns_write_sram(card, + NS_RCT + + (vpi << card->vcibits | vci) * + NS_RCT_ENTRY_SIZE, &status, 1); + } + } + set_bit(ATM_VF_READY, &vcc->flags); + return 0; +} static void ns_close(struct atm_vcc *vcc) { - vc_map *vc; - ns_dev *card; - u32 data; - int i; - - vc = vcc->dev_data; - card = vcc->dev->dev_data; - PRINTK("nicstar%d: closing vpi.vci %d.%d \n", card->index, - (int) vcc->vpi, vcc->vci); - - clear_bit(ATM_VF_READY,&vcc->flags); - - if (vcc->qos.rxtp.traffic_class != ATM_NONE) - { - u32 addr; - unsigned long flags; - - addr = NS_RCT + (vcc->vpi << card->vcibits | vcc->vci) * NS_RCT_ENTRY_SIZE; - ns_grab_res_lock(card, flags); - while(CMD_BUSY(card)); - writel(NS_CMD_CLOSE_CONNECTION | addr << 2, card->membase + CMD); - spin_unlock_irqrestore(&card->res_lock, flags); - - vc->rx = 0; - if (vc->rx_iov != NULL) - { - struct sk_buff *iovb; - u32 stat; - - stat = readl(card->membase + STAT); - card->sbfqc = ns_stat_sfbqc_get(stat); - card->lbfqc = ns_stat_lfbqc_get(stat); - - PRINTK("nicstar%d: closing a VC with pending rx buffers.\n", - card->index); - iovb = vc->rx_iov; - recycle_iovec_rx_bufs(card, (struct iovec *) iovb->data, - NS_SKB(iovb)->iovcnt); - NS_SKB(iovb)->iovcnt = 0; - NS_SKB(iovb)->vcc = NULL; - ns_grab_int_lock(card, flags); - recycle_iov_buf(card, iovb); - spin_unlock_irqrestore(&card->int_lock, flags); - vc->rx_iov = NULL; - } - } - - if (vcc->qos.txtp.traffic_class != ATM_NONE) - { - vc->tx = 0; - } - - if (vcc->qos.txtp.traffic_class == ATM_CBR) - { - unsigned long flags; - ns_scqe *scqep; - scq_info *scq; - - scq = vc->scq; - - for (;;) - { - ns_grab_scq_lock(card, scq, flags); - scqep = scq->next; - if (scqep == scq->base) - scqep = scq->last; - else - scqep--; - if (scqep == scq->tail) - { - spin_unlock_irqrestore(&scq->lock, flags); - break; - } - /* If the last entry is not a TSR, place one in the SCQ in order to - be able to completely drain it and then close. */ - if (!ns_scqe_is_tsr(scqep) && scq->tail != scq->next) - { - ns_scqe tsr; - u32 scdi, scqi; - u32 data; - int index; - - tsr.word_1 = ns_tsr_mkword_1(NS_TSR_INTENABLE); - scdi = (vc->cbr_scd - NS_FRSCD) / NS_FRSCD_SIZE; - scqi = scq->next - scq->base; - tsr.word_2 = ns_tsr_mkword_2(scdi, scqi); - tsr.word_3 = 0x00000000; - tsr.word_4 = 0x00000000; - *scq->next = tsr; - index = (int) scqi; - scq->skb[index] = NULL; - if (scq->next == scq->last) - scq->next = scq->base; - else - scq->next++; - data = (u32) virt_to_bus(scq->next); - ns_write_sram(card, scq->scd, &data, 1); - } - spin_unlock_irqrestore(&scq->lock, flags); - schedule(); - } - - /* Free all TST entries */ - data = NS_TST_OPCODE_VARIABLE; - for (i = 0; i < NS_TST_NUM_ENTRIES; i++) - { - if (card->tste2vc[i] == vc) - { - ns_write_sram(card, card->tst_addr + i, &data, 1); - card->tste2vc[i] = NULL; - card->tst_free_entries++; - } - } - - card->scd2vc[(vc->cbr_scd - NS_FRSCD) / NS_FRSCD_SIZE] = NULL; - free_scq(vc->scq, vcc); - } - - /* remove all references to vcc before deleting it */ - if (vcc->qos.txtp.traffic_class != ATM_NONE) - { - unsigned long flags; - scq_info *scq = card->scq0; - - ns_grab_scq_lock(card, scq, flags); - - for(i = 0; i < scq->num_entries; i++) { - if(scq->skb[i] && ATM_SKB(scq->skb[i])->vcc == vcc) { - ATM_SKB(scq->skb[i])->vcc = NULL; - atm_return(vcc, scq->skb[i]->truesize); - PRINTK("nicstar: deleted pending vcc mapping\n"); - } - } - - spin_unlock_irqrestore(&scq->lock, flags); - } - - vcc->dev_data = NULL; - clear_bit(ATM_VF_PARTIAL,&vcc->flags); - clear_bit(ATM_VF_ADDR,&vcc->flags); + vc_map *vc; + ns_dev *card; + u32 data; + int i; + + vc = vcc->dev_data; + card = vcc->dev->dev_data; + PRINTK("nicstar%d: closing vpi.vci %d.%d \n", card->index, + (int)vcc->vpi, vcc->vci); + + clear_bit(ATM_VF_READY, &vcc->flags); + + if (vcc->qos.rxtp.traffic_class != ATM_NONE) { + u32 addr; + unsigned long flags; + + addr = + NS_RCT + + (vcc->vpi << card->vcibits | vcc->vci) * NS_RCT_ENTRY_SIZE; + spin_lock_irqsave(&card->res_lock, flags); + while (CMD_BUSY(card)) ; + writel(NS_CMD_CLOSE_CONNECTION | addr << 2, + card->membase + CMD); + spin_unlock_irqrestore(&card->res_lock, flags); + + vc->rx = 0; + if (vc->rx_iov != NULL) { + struct sk_buff *iovb; + u32 stat; + + stat = readl(card->membase + STAT); + card->sbfqc = ns_stat_sfbqc_get(stat); + card->lbfqc = ns_stat_lfbqc_get(stat); + + PRINTK + ("nicstar%d: closing a VC with pending rx buffers.\n", + card->index); + iovb = vc->rx_iov; + recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data, + NS_PRV_IOVCNT(iovb)); + NS_PRV_IOVCNT(iovb) = 0; + spin_lock_irqsave(&card->int_lock, flags); + recycle_iov_buf(card, iovb); + spin_unlock_irqrestore(&card->int_lock, flags); + vc->rx_iov = NULL; + } + } + + if (vcc->qos.txtp.traffic_class != ATM_NONE) { + vc->tx = 0; + } + + if (vcc->qos.txtp.traffic_class == ATM_CBR) { + unsigned long flags; + ns_scqe *scqep; + scq_info *scq; + + scq = vc->scq; + + for (;;) { + spin_lock_irqsave(&scq->lock, flags); + scqep = scq->next; + if (scqep == scq->base) + scqep = scq->last; + else + scqep--; + if (scqep == scq->tail) { + spin_unlock_irqrestore(&scq->lock, flags); + break; + } + /* If the last entry is not a TSR, place one in the SCQ in order to + be able to completely drain it and then close. */ + if (!ns_scqe_is_tsr(scqep) && scq->tail != scq->next) { + ns_scqe tsr; + u32 scdi, scqi; + u32 data; + int index; + + tsr.word_1 = ns_tsr_mkword_1(NS_TSR_INTENABLE); + scdi = (vc->cbr_scd - NS_FRSCD) / NS_FRSCD_SIZE; + scqi = scq->next - scq->base; + tsr.word_2 = ns_tsr_mkword_2(scdi, scqi); + tsr.word_3 = 0x00000000; + tsr.word_4 = 0x00000000; + *scq->next = tsr; + index = (int)scqi; + scq->skb[index] = NULL; + if (scq->next == scq->last) + scq->next = scq->base; + else + scq->next++; + data = scq_virt_to_bus(scq, scq->next); + ns_write_sram(card, scq->scd, &data, 1); + } + spin_unlock_irqrestore(&scq->lock, flags); + schedule(); + } + + /* Free all TST entries */ + data = NS_TST_OPCODE_VARIABLE; + for (i = 0; i < NS_TST_NUM_ENTRIES; i++) { + if (card->tste2vc[i] == vc) { + ns_write_sram(card, card->tst_addr + i, &data, + 1); + card->tste2vc[i] = NULL; + card->tst_free_entries++; + } + } + + card->scd2vc[(vc->cbr_scd - NS_FRSCD) / NS_FRSCD_SIZE] = NULL; + free_scq(card, vc->scq, vcc); + } + + /* remove all references to vcc before deleting it */ + if (vcc->qos.txtp.traffic_class != ATM_NONE) { + unsigned long flags; + scq_info *scq = card->scq0; + + spin_lock_irqsave(&scq->lock, flags); + + for (i = 0; i < scq->num_entries; i++) { + if (scq->skb[i] && ATM_SKB(scq->skb[i])->vcc == vcc) { + ATM_SKB(scq->skb[i])->vcc = NULL; + atm_return(vcc, scq->skb[i]->truesize); + PRINTK + ("nicstar: deleted pending vcc mapping\n"); + } + } + + spin_unlock_irqrestore(&scq->lock, flags); + } + + vcc->dev_data = NULL; + clear_bit(ATM_VF_PARTIAL, &vcc->flags); + clear_bit(ATM_VF_ADDR, &vcc->flags); #ifdef RX_DEBUG - { - u32 stat, cfg; - stat = readl(card->membase + STAT); - cfg = readl(card->membase + CFG); - printk("STAT = 0x%08X CFG = 0x%08X \n", stat, cfg); - printk("TSQ: base = 0x%08X next = 0x%08X last = 0x%08X TSQT = 0x%08X \n", - (u32) card->tsq.base, (u32) card->tsq.next,(u32) card->tsq.last, - readl(card->membase + TSQT)); - printk("RSQ: base = 0x%08X next = 0x%08X last = 0x%08X RSQT = 0x%08X \n", - (u32) card->rsq.base, (u32) card->rsq.next,(u32) card->rsq.last, - readl(card->membase + RSQT)); - printk("Empty free buffer queue interrupt %s \n", - card->efbie ? "enabled" : "disabled"); - printk("SBCNT = %d count = %d LBCNT = %d count = %d \n", - ns_stat_sfbqc_get(stat), card->sbpool.count, - ns_stat_lfbqc_get(stat), card->lbpool.count); - printk("hbpool.count = %d iovpool.count = %d \n", - card->hbpool.count, card->iovpool.count); - } + { + u32 stat, cfg; + stat = readl(card->membase + STAT); + cfg = readl(card->membase + CFG); + printk("STAT = 0x%08X CFG = 0x%08X \n", stat, cfg); + printk + ("TSQ: base = 0x%p next = 0x%p last = 0x%p TSQT = 0x%08X \n", + card->tsq.base, card->tsq.next, + card->tsq.last, readl(card->membase + TSQT)); + printk + ("RSQ: base = 0x%p next = 0x%p last = 0x%p RSQT = 0x%08X \n", + card->rsq.base, card->rsq.next, + card->rsq.last, readl(card->membase + RSQT)); + printk("Empty free buffer queue interrupt %s \n", + card->efbie ? "enabled" : "disabled"); + printk("SBCNT = %d count = %d LBCNT = %d count = %d \n", + ns_stat_sfbqc_get(stat), card->sbpool.count, + ns_stat_lfbqc_get(stat), card->lbpool.count); + printk("hbpool.count = %d iovpool.count = %d \n", + card->hbpool.count, card->iovpool.count); + } #endif /* RX_DEBUG */ } - - -static void fill_tst(ns_dev *card, int n, vc_map *vc) +static void fill_tst(ns_dev * card, int n, vc_map * vc) { - u32 new_tst; - unsigned long cl; - int e, r; - u32 data; - - /* It would be very complicated to keep the two TSTs synchronized while - assuring that writes are only made to the inactive TST. So, for now I - will use only one TST. If problems occur, I will change this again */ - - new_tst = card->tst_addr; - - /* Fill procedure */ - - for (e = 0; e < NS_TST_NUM_ENTRIES; e++) - { - if (card->tste2vc[e] == NULL) - break; - } - if (e == NS_TST_NUM_ENTRIES) { - printk("nicstar%d: No free TST entries found. \n", card->index); - return; - } - - r = n; - cl = NS_TST_NUM_ENTRIES; - data = ns_tste_make(NS_TST_OPCODE_FIXED, vc->cbr_scd); - - while (r > 0) - { - if (cl >= NS_TST_NUM_ENTRIES && card->tste2vc[e] == NULL) - { - card->tste2vc[e] = vc; - ns_write_sram(card, new_tst + e, &data, 1); - cl -= NS_TST_NUM_ENTRIES; - r--; - } - - if (++e == NS_TST_NUM_ENTRIES) { - e = 0; - } - cl += n; - } - - /* End of fill procedure */ - - data = ns_tste_make(NS_TST_OPCODE_END, new_tst); - ns_write_sram(card, new_tst + NS_TST_NUM_ENTRIES, &data, 1); - ns_write_sram(card, card->tst_addr + NS_TST_NUM_ENTRIES, &data, 1); - card->tst_addr = new_tst; + u32 new_tst; + unsigned long cl; + int e, r; + u32 data; + + /* It would be very complicated to keep the two TSTs synchronized while + assuring that writes are only made to the inactive TST. So, for now I + will use only one TST. If problems occur, I will change this again */ + + new_tst = card->tst_addr; + + /* Fill procedure */ + + for (e = 0; e < NS_TST_NUM_ENTRIES; e++) { + if (card->tste2vc[e] == NULL) + break; + } + if (e == NS_TST_NUM_ENTRIES) { + printk("nicstar%d: No free TST entries found. \n", card->index); + return; + } + + r = n; + cl = NS_TST_NUM_ENTRIES; + data = ns_tste_make(NS_TST_OPCODE_FIXED, vc->cbr_scd); + + while (r > 0) { + if (cl >= NS_TST_NUM_ENTRIES && card->tste2vc[e] == NULL) { + card->tste2vc[e] = vc; + ns_write_sram(card, new_tst + e, &data, 1); + cl -= NS_TST_NUM_ENTRIES; + r--; + } + + if (++e == NS_TST_NUM_ENTRIES) { + e = 0; + } + cl += n; + } + + /* End of fill procedure */ + + data = ns_tste_make(NS_TST_OPCODE_END, new_tst); + ns_write_sram(card, new_tst + NS_TST_NUM_ENTRIES, &data, 1); + ns_write_sram(card, card->tst_addr + NS_TST_NUM_ENTRIES, &data, 1); + card->tst_addr = new_tst; } - - static int ns_send(struct atm_vcc *vcc, struct sk_buff *skb) { - ns_dev *card; - vc_map *vc; - scq_info *scq; - unsigned long buflen; - ns_scqe scqe; - u32 flags; /* TBD flags, not CPU flags */ - - card = vcc->dev->dev_data; - TXPRINTK("nicstar%d: ns_send() called.\n", card->index); - if ((vc = (vc_map *) vcc->dev_data) == NULL) - { - printk("nicstar%d: vcc->dev_data == NULL on ns_send().\n", card->index); - atomic_inc(&vcc->stats->tx_err); - dev_kfree_skb_any(skb); - return -EINVAL; - } - - if (!vc->tx) - { - printk("nicstar%d: Trying to transmit on a non-tx VC.\n", card->index); - atomic_inc(&vcc->stats->tx_err); - dev_kfree_skb_any(skb); - return -EINVAL; - } - - if (vcc->qos.aal != ATM_AAL5 && vcc->qos.aal != ATM_AAL0) - { - printk("nicstar%d: Only AAL0 and AAL5 are supported.\n", card->index); - atomic_inc(&vcc->stats->tx_err); - dev_kfree_skb_any(skb); - return -EINVAL; - } - - if (skb_shinfo(skb)->nr_frags != 0) - { - printk("nicstar%d: No scatter-gather yet.\n", card->index); - atomic_inc(&vcc->stats->tx_err); - dev_kfree_skb_any(skb); - return -EINVAL; - } - - ATM_SKB(skb)->vcc = vcc; - - if (vcc->qos.aal == ATM_AAL5) - { - buflen = (skb->len + 47 + 8) / 48 * 48; /* Multiple of 48 */ - flags = NS_TBD_AAL5; - scqe.word_2 = cpu_to_le32((u32) virt_to_bus(skb->data)); - scqe.word_3 = cpu_to_le32((u32) skb->len); - scqe.word_4 = ns_tbd_mkword_4(0, (u32) vcc->vpi, (u32) vcc->vci, 0, - ATM_SKB(skb)->atm_options & ATM_ATMOPT_CLP ? 1 : 0); - flags |= NS_TBD_EOPDU; - } - else /* (vcc->qos.aal == ATM_AAL0) */ - { - buflen = ATM_CELL_PAYLOAD; /* i.e., 48 bytes */ - flags = NS_TBD_AAL0; - scqe.word_2 = cpu_to_le32((u32) virt_to_bus(skb->data) + NS_AAL0_HEADER); - scqe.word_3 = cpu_to_le32(0x00000000); - if (*skb->data & 0x02) /* Payload type 1 - end of pdu */ - flags |= NS_TBD_EOPDU; - scqe.word_4 = cpu_to_le32(*((u32 *) skb->data) & ~NS_TBD_VC_MASK); - /* Force the VPI/VCI to be the same as in VCC struct */ - scqe.word_4 |= cpu_to_le32((((u32) vcc->vpi) << NS_TBD_VPI_SHIFT | - ((u32) vcc->vci) << NS_TBD_VCI_SHIFT) & - NS_TBD_VC_MASK); - } - - if (vcc->qos.txtp.traffic_class == ATM_CBR) - { - scqe.word_1 = ns_tbd_mkword_1_novbr(flags, (u32) buflen); - scq = ((vc_map *) vcc->dev_data)->scq; - } - else - { - scqe.word_1 = ns_tbd_mkword_1(flags, (u32) 1, (u32) 1, (u32) buflen); - scq = card->scq0; - } - - if (push_scqe(card, vc, scq, &scqe, skb) != 0) - { - atomic_inc(&vcc->stats->tx_err); - dev_kfree_skb_any(skb); - return -EIO; - } - atomic_inc(&vcc->stats->tx); - - return 0; -} - + ns_dev *card; + vc_map *vc; + scq_info *scq; + unsigned long buflen; + ns_scqe scqe; + u32 flags; /* TBD flags, not CPU flags */ + + card = vcc->dev->dev_data; + TXPRINTK("nicstar%d: ns_send() called.\n", card->index); + if ((vc = (vc_map *) vcc->dev_data) == NULL) { + printk("nicstar%d: vcc->dev_data == NULL on ns_send().\n", + card->index); + atomic_inc(&vcc->stats->tx_err); + dev_kfree_skb_any(skb); + return -EINVAL; + } + if (!vc->tx) { + printk("nicstar%d: Trying to transmit on a non-tx VC.\n", + card->index); + atomic_inc(&vcc->stats->tx_err); + dev_kfree_skb_any(skb); + return -EINVAL; + } -static int push_scqe(ns_dev *card, vc_map *vc, scq_info *scq, ns_scqe *tbd, - struct sk_buff *skb) -{ - unsigned long flags; - ns_scqe tsr; - u32 scdi, scqi; - int scq_is_vbr; - u32 data; - int index; - - ns_grab_scq_lock(card, scq, flags); - while (scq->tail == scq->next) - { - if (in_interrupt()) { - spin_unlock_irqrestore(&scq->lock, flags); - printk("nicstar%d: Error pushing TBD.\n", card->index); - return 1; - } - - scq->full = 1; - spin_unlock_irqrestore(&scq->lock, flags); - interruptible_sleep_on_timeout(&scq->scqfull_waitq, SCQFULL_TIMEOUT); - ns_grab_scq_lock(card, scq, flags); - - if (scq->full) { - spin_unlock_irqrestore(&scq->lock, flags); - printk("nicstar%d: Timeout pushing TBD.\n", card->index); - return 1; - } - } - *scq->next = *tbd; - index = (int) (scq->next - scq->base); - scq->skb[index] = skb; - XPRINTK("nicstar%d: sending skb at 0x%x (pos %d).\n", - card->index, (u32) skb, index); - XPRINTK("nicstar%d: TBD written:\n0x%x\n0x%x\n0x%x\n0x%x\n at 0x%x.\n", - card->index, le32_to_cpu(tbd->word_1), le32_to_cpu(tbd->word_2), - le32_to_cpu(tbd->word_3), le32_to_cpu(tbd->word_4), - (u32) scq->next); - if (scq->next == scq->last) - scq->next = scq->base; - else - scq->next++; - - vc->tbd_count++; - if (scq->num_entries == VBR_SCQ_NUM_ENTRIES) - { - scq->tbd_count++; - scq_is_vbr = 1; - } - else - scq_is_vbr = 0; - - if (vc->tbd_count >= MAX_TBD_PER_VC || scq->tbd_count >= MAX_TBD_PER_SCQ) - { - int has_run = 0; - - while (scq->tail == scq->next) - { - if (in_interrupt()) { - data = (u32) virt_to_bus(scq->next); - ns_write_sram(card, scq->scd, &data, 1); - spin_unlock_irqrestore(&scq->lock, flags); - printk("nicstar%d: Error pushing TSR.\n", card->index); - return 0; - } - - scq->full = 1; - if (has_run++) break; - spin_unlock_irqrestore(&scq->lock, flags); - interruptible_sleep_on_timeout(&scq->scqfull_waitq, SCQFULL_TIMEOUT); - ns_grab_scq_lock(card, scq, flags); - } - - if (!scq->full) - { - tsr.word_1 = ns_tsr_mkword_1(NS_TSR_INTENABLE); - if (scq_is_vbr) - scdi = NS_TSR_SCDISVBR; - else - scdi = (vc->cbr_scd - NS_FRSCD) / NS_FRSCD_SIZE; - scqi = scq->next - scq->base; - tsr.word_2 = ns_tsr_mkword_2(scdi, scqi); - tsr.word_3 = 0x00000000; - tsr.word_4 = 0x00000000; - - *scq->next = tsr; - index = (int) scqi; - scq->skb[index] = NULL; - XPRINTK("nicstar%d: TSR written:\n0x%x\n0x%x\n0x%x\n0x%x\n at 0x%x.\n", - card->index, le32_to_cpu(tsr.word_1), le32_to_cpu(tsr.word_2), - le32_to_cpu(tsr.word_3), le32_to_cpu(tsr.word_4), - (u32) scq->next); - if (scq->next == scq->last) - scq->next = scq->base; - else - scq->next++; - vc->tbd_count = 0; - scq->tbd_count = 0; - } - else - PRINTK("nicstar%d: Timeout pushing TSR.\n", card->index); - } - data = (u32) virt_to_bus(scq->next); - ns_write_sram(card, scq->scd, &data, 1); - - spin_unlock_irqrestore(&scq->lock, flags); - - return 0; -} + if (vcc->qos.aal != ATM_AAL5 && vcc->qos.aal != ATM_AAL0) { + printk("nicstar%d: Only AAL0 and AAL5 are supported.\n", + card->index); + atomic_inc(&vcc->stats->tx_err); + dev_kfree_skb_any(skb); + return -EINVAL; + } + if (skb_shinfo(skb)->nr_frags != 0) { + printk("nicstar%d: No scatter-gather yet.\n", card->index); + atomic_inc(&vcc->stats->tx_err); + dev_kfree_skb_any(skb); + return -EINVAL; + } + + ATM_SKB(skb)->vcc = vcc; + + NS_PRV_DMA(skb) = pci_map_single(card->pcidev, skb->data, + skb->len, PCI_DMA_TODEVICE); + + if (vcc->qos.aal == ATM_AAL5) { + buflen = (skb->len + 47 + 8) / 48 * 48; /* Multiple of 48 */ + flags = NS_TBD_AAL5; + scqe.word_2 = cpu_to_le32(NS_PRV_DMA(skb)); + scqe.word_3 = cpu_to_le32(skb->len); + scqe.word_4 = + ns_tbd_mkword_4(0, (u32) vcc->vpi, (u32) vcc->vci, 0, + ATM_SKB(skb)-> + atm_options & ATM_ATMOPT_CLP ? 1 : 0); + flags |= NS_TBD_EOPDU; + } else { /* (vcc->qos.aal == ATM_AAL0) */ + + buflen = ATM_CELL_PAYLOAD; /* i.e., 48 bytes */ + flags = NS_TBD_AAL0; + scqe.word_2 = cpu_to_le32(NS_PRV_DMA(skb) + NS_AAL0_HEADER); + scqe.word_3 = cpu_to_le32(0x00000000); + if (*skb->data & 0x02) /* Payload type 1 - end of pdu */ + flags |= NS_TBD_EOPDU; + scqe.word_4 = + cpu_to_le32(*((u32 *) skb->data) & ~NS_TBD_VC_MASK); + /* Force the VPI/VCI to be the same as in VCC struct */ + scqe.word_4 |= + cpu_to_le32((((u32) vcc-> + vpi) << NS_TBD_VPI_SHIFT | ((u32) vcc-> + vci) << + NS_TBD_VCI_SHIFT) & NS_TBD_VC_MASK); + } + + if (vcc->qos.txtp.traffic_class == ATM_CBR) { + scqe.word_1 = ns_tbd_mkword_1_novbr(flags, (u32) buflen); + scq = ((vc_map *) vcc->dev_data)->scq; + } else { + scqe.word_1 = + ns_tbd_mkword_1(flags, (u32) 1, (u32) 1, (u32) buflen); + scq = card->scq0; + } + + if (push_scqe(card, vc, scq, &scqe, skb) != 0) { + atomic_inc(&vcc->stats->tx_err); + dev_kfree_skb_any(skb); + return -EIO; + } + atomic_inc(&vcc->stats->tx); + return 0; +} -static void process_tsq(ns_dev *card) +static int push_scqe(ns_dev * card, vc_map * vc, scq_info * scq, ns_scqe * tbd, + struct sk_buff *skb) { - u32 scdi; - scq_info *scq; - ns_tsi *previous = NULL, *one_ahead, *two_ahead; - int serviced_entries; /* flag indicating at least on entry was serviced */ - - serviced_entries = 0; - - if (card->tsq.next == card->tsq.last) - one_ahead = card->tsq.base; - else - one_ahead = card->tsq.next + 1; - - if (one_ahead == card->tsq.last) - two_ahead = card->tsq.base; - else - two_ahead = one_ahead + 1; - - while (!ns_tsi_isempty(card->tsq.next) || !ns_tsi_isempty(one_ahead) || - !ns_tsi_isempty(two_ahead)) - /* At most two empty, as stated in the 77201 errata */ - { - serviced_entries = 1; - - /* Skip the one or two possible empty entries */ - while (ns_tsi_isempty(card->tsq.next)) { - if (card->tsq.next == card->tsq.last) - card->tsq.next = card->tsq.base; - else - card->tsq.next++; - } - - if (!ns_tsi_tmrof(card->tsq.next)) - { - scdi = ns_tsi_getscdindex(card->tsq.next); - if (scdi == NS_TSI_SCDISVBR) - scq = card->scq0; - else - { - if (card->scd2vc[scdi] == NULL) - { - printk("nicstar%d: could not find VC from SCD index.\n", - card->index); - ns_tsi_init(card->tsq.next); - return; - } - scq = card->scd2vc[scdi]->scq; - } - drain_scq(card, scq, ns_tsi_getscqpos(card->tsq.next)); - scq->full = 0; - wake_up_interruptible(&(scq->scqfull_waitq)); - } - - ns_tsi_init(card->tsq.next); - previous = card->tsq.next; - if (card->tsq.next == card->tsq.last) - card->tsq.next = card->tsq.base; - else - card->tsq.next++; - - if (card->tsq.next == card->tsq.last) - one_ahead = card->tsq.base; - else - one_ahead = card->tsq.next + 1; - - if (one_ahead == card->tsq.last) - two_ahead = card->tsq.base; - else - two_ahead = one_ahead + 1; - } - - if (serviced_entries) { - writel((((u32) previous) - ((u32) card->tsq.base)), - card->membase + TSQH); - } + unsigned long flags; + ns_scqe tsr; + u32 scdi, scqi; + int scq_is_vbr; + u32 data; + int index; + + spin_lock_irqsave(&scq->lock, flags); + while (scq->tail == scq->next) { + if (in_interrupt()) { + spin_unlock_irqrestore(&scq->lock, flags); + printk("nicstar%d: Error pushing TBD.\n", card->index); + return 1; + } + + scq->full = 1; + wait_event_interruptible_lock_irq_timeout(scq->scqfull_waitq, + scq->tail != scq->next, + scq->lock, + SCQFULL_TIMEOUT); + + if (scq->full) { + spin_unlock_irqrestore(&scq->lock, flags); + printk("nicstar%d: Timeout pushing TBD.\n", + card->index); + return 1; + } + } + *scq->next = *tbd; + index = (int)(scq->next - scq->base); + scq->skb[index] = skb; + XPRINTK("nicstar%d: sending skb at 0x%p (pos %d).\n", + card->index, skb, index); + XPRINTK("nicstar%d: TBD written:\n0x%x\n0x%x\n0x%x\n0x%x\n at 0x%p.\n", + card->index, le32_to_cpu(tbd->word_1), le32_to_cpu(tbd->word_2), + le32_to_cpu(tbd->word_3), le32_to_cpu(tbd->word_4), + scq->next); + if (scq->next == scq->last) + scq->next = scq->base; + else + scq->next++; + + vc->tbd_count++; + if (scq->num_entries == VBR_SCQ_NUM_ENTRIES) { + scq->tbd_count++; + scq_is_vbr = 1; + } else + scq_is_vbr = 0; + + if (vc->tbd_count >= MAX_TBD_PER_VC + || scq->tbd_count >= MAX_TBD_PER_SCQ) { + int has_run = 0; + + while (scq->tail == scq->next) { + if (in_interrupt()) { + data = scq_virt_to_bus(scq, scq->next); + ns_write_sram(card, scq->scd, &data, 1); + spin_unlock_irqrestore(&scq->lock, flags); + printk("nicstar%d: Error pushing TSR.\n", + card->index); + return 0; + } + + scq->full = 1; + if (has_run++) + break; + wait_event_interruptible_lock_irq_timeout(scq->scqfull_waitq, + scq->tail != scq->next, + scq->lock, + SCQFULL_TIMEOUT); + } + + if (!scq->full) { + tsr.word_1 = ns_tsr_mkword_1(NS_TSR_INTENABLE); + if (scq_is_vbr) + scdi = NS_TSR_SCDISVBR; + else + scdi = (vc->cbr_scd - NS_FRSCD) / NS_FRSCD_SIZE; + scqi = scq->next - scq->base; + tsr.word_2 = ns_tsr_mkword_2(scdi, scqi); + tsr.word_3 = 0x00000000; + tsr.word_4 = 0x00000000; + + *scq->next = tsr; + index = (int)scqi; + scq->skb[index] = NULL; + XPRINTK + ("nicstar%d: TSR written:\n0x%x\n0x%x\n0x%x\n0x%x\n at 0x%p.\n", + card->index, le32_to_cpu(tsr.word_1), + le32_to_cpu(tsr.word_2), le32_to_cpu(tsr.word_3), + le32_to_cpu(tsr.word_4), scq->next); + if (scq->next == scq->last) + scq->next = scq->base; + else + scq->next++; + vc->tbd_count = 0; + scq->tbd_count = 0; + } else + PRINTK("nicstar%d: Timeout pushing TSR.\n", + card->index); + } + data = scq_virt_to_bus(scq, scq->next); + ns_write_sram(card, scq->scd, &data, 1); + + spin_unlock_irqrestore(&scq->lock, flags); + + return 0; } - - -static void drain_scq(ns_dev *card, scq_info *scq, int pos) +static void process_tsq(ns_dev * card) { - struct atm_vcc *vcc; - struct sk_buff *skb; - int i; - unsigned long flags; - - XPRINTK("nicstar%d: drain_scq() called, scq at 0x%x, pos %d.\n", - card->index, (u32) scq, pos); - if (pos >= scq->num_entries) - { - printk("nicstar%d: Bad index on drain_scq().\n", card->index); - return; - } - - ns_grab_scq_lock(card, scq, flags); - i = (int) (scq->tail - scq->base); - if (++i == scq->num_entries) - i = 0; - while (i != pos) - { - skb = scq->skb[i]; - XPRINTK("nicstar%d: freeing skb at 0x%x (index %d).\n", - card->index, (u32) skb, i); - if (skb != NULL) - { - vcc = ATM_SKB(skb)->vcc; - if (vcc && vcc->pop != NULL) { - vcc->pop(vcc, skb); - } else { - dev_kfree_skb_irq(skb); - } - scq->skb[i] = NULL; - } - if (++i == scq->num_entries) - i = 0; - } - scq->tail = scq->base + pos; - spin_unlock_irqrestore(&scq->lock, flags); + u32 scdi; + scq_info *scq; + ns_tsi *previous = NULL, *one_ahead, *two_ahead; + int serviced_entries; /* flag indicating at least on entry was serviced */ + + serviced_entries = 0; + + if (card->tsq.next == card->tsq.last) + one_ahead = card->tsq.base; + else + one_ahead = card->tsq.next + 1; + + if (one_ahead == card->tsq.last) + two_ahead = card->tsq.base; + else + two_ahead = one_ahead + 1; + + while (!ns_tsi_isempty(card->tsq.next) || !ns_tsi_isempty(one_ahead) || + !ns_tsi_isempty(two_ahead)) + /* At most two empty, as stated in the 77201 errata */ + { + serviced_entries = 1; + + /* Skip the one or two possible empty entries */ + while (ns_tsi_isempty(card->tsq.next)) { + if (card->tsq.next == card->tsq.last) + card->tsq.next = card->tsq.base; + else + card->tsq.next++; + } + + if (!ns_tsi_tmrof(card->tsq.next)) { + scdi = ns_tsi_getscdindex(card->tsq.next); + if (scdi == NS_TSI_SCDISVBR) + scq = card->scq0; + else { + if (card->scd2vc[scdi] == NULL) { + printk + ("nicstar%d: could not find VC from SCD index.\n", + card->index); + ns_tsi_init(card->tsq.next); + return; + } + scq = card->scd2vc[scdi]->scq; + } + drain_scq(card, scq, ns_tsi_getscqpos(card->tsq.next)); + scq->full = 0; + wake_up_interruptible(&(scq->scqfull_waitq)); + } + + ns_tsi_init(card->tsq.next); + previous = card->tsq.next; + if (card->tsq.next == card->tsq.last) + card->tsq.next = card->tsq.base; + else + card->tsq.next++; + + if (card->tsq.next == card->tsq.last) + one_ahead = card->tsq.base; + else + one_ahead = card->tsq.next + 1; + + if (one_ahead == card->tsq.last) + two_ahead = card->tsq.base; + else + two_ahead = one_ahead + 1; + } + + if (serviced_entries) + writel(PTR_DIFF(previous, card->tsq.base), + card->membase + TSQH); } +static void drain_scq(ns_dev * card, scq_info * scq, int pos) +{ + struct atm_vcc *vcc; + struct sk_buff *skb; + int i; + unsigned long flags; + + XPRINTK("nicstar%d: drain_scq() called, scq at 0x%p, pos %d.\n", + card->index, scq, pos); + if (pos >= scq->num_entries) { + printk("nicstar%d: Bad index on drain_scq().\n", card->index); + return; + } + + spin_lock_irqsave(&scq->lock, flags); + i = (int)(scq->tail - scq->base); + if (++i == scq->num_entries) + i = 0; + while (i != pos) { + skb = scq->skb[i]; + XPRINTK("nicstar%d: freeing skb at 0x%p (index %d).\n", + card->index, skb, i); + if (skb != NULL) { + pci_unmap_single(card->pcidev, + NS_PRV_DMA(skb), + skb->len, + PCI_DMA_TODEVICE); + vcc = ATM_SKB(skb)->vcc; + if (vcc && vcc->pop != NULL) { + vcc->pop(vcc, skb); + } else { + dev_kfree_skb_irq(skb); + } + scq->skb[i] = NULL; + } + if (++i == scq->num_entries) + i = 0; + } + scq->tail = scq->base + pos; + spin_unlock_irqrestore(&scq->lock, flags); +} - -static void process_rsq(ns_dev *card) +static void process_rsq(ns_dev * card) { - ns_rsqe *previous; - - if (!ns_rsqe_valid(card->rsq.next)) - return; - do { - dequeue_rx(card, card->rsq.next); - ns_rsqe_init(card->rsq.next); - previous = card->rsq.next; - if (card->rsq.next == card->rsq.last) - card->rsq.next = card->rsq.base; - else - card->rsq.next++; - } while (ns_rsqe_valid(card->rsq.next)); - writel((((u32) previous) - ((u32) card->rsq.base)), - card->membase + RSQH); + ns_rsqe *previous; + + if (!ns_rsqe_valid(card->rsq.next)) + return; + do { + dequeue_rx(card, card->rsq.next); + ns_rsqe_init(card->rsq.next); + previous = card->rsq.next; + if (card->rsq.next == card->rsq.last) + card->rsq.next = card->rsq.base; + else + card->rsq.next++; + } while (ns_rsqe_valid(card->rsq.next)); + writel(PTR_DIFF(previous, card->rsq.base), card->membase + RSQH); } +static void dequeue_rx(ns_dev * card, ns_rsqe * rsqe) +{ + u32 vpi, vci; + vc_map *vc; + struct sk_buff *iovb; + struct iovec *iov; + struct atm_vcc *vcc; + struct sk_buff *skb; + unsigned short aal5_len; + int len; + u32 stat; + u32 id; + + stat = readl(card->membase + STAT); + card->sbfqc = ns_stat_sfbqc_get(stat); + card->lbfqc = ns_stat_lfbqc_get(stat); + + id = le32_to_cpu(rsqe->buffer_handle); + skb = idr_find(&card->idr, id); + if (!skb) { + RXPRINTK(KERN_ERR + "nicstar%d: idr_find() failed!\n", card->index); + return; + } + idr_remove(&card->idr, id); + pci_dma_sync_single_for_cpu(card->pcidev, + NS_PRV_DMA(skb), + (NS_PRV_BUFTYPE(skb) == BUF_SM + ? NS_SMSKBSIZE : NS_LGSKBSIZE), + PCI_DMA_FROMDEVICE); + pci_unmap_single(card->pcidev, + NS_PRV_DMA(skb), + (NS_PRV_BUFTYPE(skb) == BUF_SM + ? NS_SMSKBSIZE : NS_LGSKBSIZE), + PCI_DMA_FROMDEVICE); + vpi = ns_rsqe_vpi(rsqe); + vci = ns_rsqe_vci(rsqe); + if (vpi >= 1UL << card->vpibits || vci >= 1UL << card->vcibits) { + printk("nicstar%d: SDU received for out-of-range vc %d.%d.\n", + card->index, vpi, vci); + recycle_rx_buf(card, skb); + return; + } + + vc = &(card->vcmap[vpi << card->vcibits | vci]); + if (!vc->rx) { + RXPRINTK("nicstar%d: SDU received on non-rx vc %d.%d.\n", + card->index, vpi, vci); + recycle_rx_buf(card, skb); + return; + } + + vcc = vc->rx_vcc; + + if (vcc->qos.aal == ATM_AAL0) { + struct sk_buff *sb; + unsigned char *cell; + int i; + + cell = skb->data; + for (i = ns_rsqe_cellcount(rsqe); i; i--) { + if ((sb = dev_alloc_skb(NS_SMSKBSIZE)) == NULL) { + printk + ("nicstar%d: Can't allocate buffers for aal0.\n", + card->index); + atomic_add(i, &vcc->stats->rx_drop); + break; + } + if (!atm_charge(vcc, sb->truesize)) { + RXPRINTK + ("nicstar%d: atm_charge() dropped aal0 packets.\n", + card->index); + atomic_add(i - 1, &vcc->stats->rx_drop); /* already increased by 1 */ + dev_kfree_skb_any(sb); + break; + } + /* Rebuild the header */ + *((u32 *) sb->data) = le32_to_cpu(rsqe->word_1) << 4 | + (ns_rsqe_clp(rsqe) ? 0x00000001 : 0x00000000); + if (i == 1 && ns_rsqe_eopdu(rsqe)) + *((u32 *) sb->data) |= 0x00000002; + skb_put(sb, NS_AAL0_HEADER); + memcpy(skb_tail_pointer(sb), cell, ATM_CELL_PAYLOAD); + skb_put(sb, ATM_CELL_PAYLOAD); + ATM_SKB(sb)->vcc = vcc; + __net_timestamp(sb); + vcc->push(vcc, sb); + atomic_inc(&vcc->stats->rx); + cell += ATM_CELL_PAYLOAD; + } + + recycle_rx_buf(card, skb); + return; + } + + /* To reach this point, the AAL layer can only be AAL5 */ + + if ((iovb = vc->rx_iov) == NULL) { + iovb = skb_dequeue(&(card->iovpool.queue)); + if (iovb == NULL) { /* No buffers in the queue */ + iovb = alloc_skb(NS_IOVBUFSIZE, GFP_ATOMIC); + if (iovb == NULL) { + printk("nicstar%d: Out of iovec buffers.\n", + card->index); + atomic_inc(&vcc->stats->rx_drop); + recycle_rx_buf(card, skb); + return; + } + NS_PRV_BUFTYPE(iovb) = BUF_NONE; + } else if (--card->iovpool.count < card->iovnr.min) { + struct sk_buff *new_iovb; + if ((new_iovb = + alloc_skb(NS_IOVBUFSIZE, GFP_ATOMIC)) != NULL) { + NS_PRV_BUFTYPE(iovb) = BUF_NONE; + skb_queue_tail(&card->iovpool.queue, new_iovb); + card->iovpool.count++; + } + } + vc->rx_iov = iovb; + NS_PRV_IOVCNT(iovb) = 0; + iovb->len = 0; + iovb->data = iovb->head; + skb_reset_tail_pointer(iovb); + /* IMPORTANT: a pointer to the sk_buff containing the small or large + buffer is stored as iovec base, NOT a pointer to the + small or large buffer itself. */ + } else if (NS_PRV_IOVCNT(iovb) >= NS_MAX_IOVECS) { + printk("nicstar%d: received too big AAL5 SDU.\n", card->index); + atomic_inc(&vcc->stats->rx_err); + recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data, + NS_MAX_IOVECS); + NS_PRV_IOVCNT(iovb) = 0; + iovb->len = 0; + iovb->data = iovb->head; + skb_reset_tail_pointer(iovb); + } + iov = &((struct iovec *)iovb->data)[NS_PRV_IOVCNT(iovb)++]; + iov->iov_base = (void *)skb; + iov->iov_len = ns_rsqe_cellcount(rsqe) * 48; + iovb->len += iov->iov_len; +#ifdef EXTRA_DEBUG + if (NS_PRV_IOVCNT(iovb) == 1) { + if (NS_PRV_BUFTYPE(skb) != BUF_SM) { + printk + ("nicstar%d: Expected a small buffer, and this is not one.\n", + card->index); + which_list(card, skb); + atomic_inc(&vcc->stats->rx_err); + recycle_rx_buf(card, skb); + vc->rx_iov = NULL; + recycle_iov_buf(card, iovb); + return; + } + } else { /* NS_PRV_IOVCNT(iovb) >= 2 */ + + if (NS_PRV_BUFTYPE(skb) != BUF_LG) { + printk + ("nicstar%d: Expected a large buffer, and this is not one.\n", + card->index); + which_list(card, skb); + atomic_inc(&vcc->stats->rx_err); + recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data, + NS_PRV_IOVCNT(iovb)); + vc->rx_iov = NULL; + recycle_iov_buf(card, iovb); + return; + } + } +#endif /* EXTRA_DEBUG */ -static void dequeue_rx(ns_dev *card, ns_rsqe *rsqe) -{ - u32 vpi, vci; - vc_map *vc; - struct sk_buff *iovb; - struct iovec *iov; - struct atm_vcc *vcc; - struct sk_buff *skb; - unsigned short aal5_len; - int len; - u32 stat; - - stat = readl(card->membase + STAT); - card->sbfqc = ns_stat_sfbqc_get(stat); - card->lbfqc = ns_stat_lfbqc_get(stat); - - skb = (struct sk_buff *) le32_to_cpu(rsqe->buffer_handle); - vpi = ns_rsqe_vpi(rsqe); - vci = ns_rsqe_vci(rsqe); - if (vpi >= 1UL << card->vpibits || vci >= 1UL << card->vcibits) - { - printk("nicstar%d: SDU received for out-of-range vc %d.%d.\n", - card->index, vpi, vci); - recycle_rx_buf(card, skb); - return; - } - - vc = &(card->vcmap[vpi << card->vcibits | vci]); - if (!vc->rx) - { - RXPRINTK("nicstar%d: SDU received on non-rx vc %d.%d.\n", - card->index, vpi, vci); - recycle_rx_buf(card, skb); - return; - } - - vcc = vc->rx_vcc; - - if (vcc->qos.aal == ATM_AAL0) - { - struct sk_buff *sb; - unsigned char *cell; - int i; - - cell = skb->data; - for (i = ns_rsqe_cellcount(rsqe); i; i--) - { - if ((sb = dev_alloc_skb(NS_SMSKBSIZE)) == NULL) - { - printk("nicstar%d: Can't allocate buffers for aal0.\n", - card->index); - atomic_add(i,&vcc->stats->rx_drop); - break; - } - if (!atm_charge(vcc, sb->truesize)) - { - RXPRINTK("nicstar%d: atm_charge() dropped aal0 packets.\n", - card->index); - atomic_add(i-1,&vcc->stats->rx_drop); /* already increased by 1 */ - dev_kfree_skb_any(sb); - break; - } - /* Rebuild the header */ - *((u32 *) sb->data) = le32_to_cpu(rsqe->word_1) << 4 | - (ns_rsqe_clp(rsqe) ? 0x00000001 : 0x00000000); - if (i == 1 && ns_rsqe_eopdu(rsqe)) - *((u32 *) sb->data) |= 0x00000002; - skb_put(sb, NS_AAL0_HEADER); - memcpy(skb_tail_pointer(sb), cell, ATM_CELL_PAYLOAD); - skb_put(sb, ATM_CELL_PAYLOAD); - ATM_SKB(sb)->vcc = vcc; - __net_timestamp(sb); - vcc->push(vcc, sb); - atomic_inc(&vcc->stats->rx); - cell += ATM_CELL_PAYLOAD; - } - - recycle_rx_buf(card, skb); - return; - } - - /* To reach this point, the AAL layer can only be AAL5 */ - - if ((iovb = vc->rx_iov) == NULL) - { - iovb = skb_dequeue(&(card->iovpool.queue)); - if (iovb == NULL) /* No buffers in the queue */ - { - iovb = alloc_skb(NS_IOVBUFSIZE, GFP_ATOMIC); - if (iovb == NULL) - { - printk("nicstar%d: Out of iovec buffers.\n", card->index); - atomic_inc(&vcc->stats->rx_drop); - recycle_rx_buf(card, skb); - return; - } - NS_SKB_CB(iovb)->buf_type = BUF_NONE; - } - else - if (--card->iovpool.count < card->iovnr.min) - { - struct sk_buff *new_iovb; - if ((new_iovb = alloc_skb(NS_IOVBUFSIZE, GFP_ATOMIC)) != NULL) - { - NS_SKB_CB(iovb)->buf_type = BUF_NONE; - skb_queue_tail(&card->iovpool.queue, new_iovb); - card->iovpool.count++; - } - } - vc->rx_iov = iovb; - NS_SKB(iovb)->iovcnt = 0; - iovb->len = 0; - iovb->data = iovb->head; - skb_reset_tail_pointer(iovb); - NS_SKB(iovb)->vcc = vcc; - /* IMPORTANT: a pointer to the sk_buff containing the small or large - buffer is stored as iovec base, NOT a pointer to the - small or large buffer itself. */ - } - else if (NS_SKB(iovb)->iovcnt >= NS_MAX_IOVECS) - { - printk("nicstar%d: received too big AAL5 SDU.\n", card->index); - atomic_inc(&vcc->stats->rx_err); - recycle_iovec_rx_bufs(card, (struct iovec *) iovb->data, NS_MAX_IOVECS); - NS_SKB(iovb)->iovcnt = 0; - iovb->len = 0; - iovb->data = iovb->head; - skb_reset_tail_pointer(iovb); - NS_SKB(iovb)->vcc = vcc; - } - iov = &((struct iovec *) iovb->data)[NS_SKB(iovb)->iovcnt++]; - iov->iov_base = (void *) skb; - iov->iov_len = ns_rsqe_cellcount(rsqe) * 48; - iovb->len += iov->iov_len; - - if (NS_SKB(iovb)->iovcnt == 1) - { - if (NS_SKB_CB(skb)->buf_type != BUF_SM) - { - printk("nicstar%d: Expected a small buffer, and this is not one.\n", - card->index); - which_list(card, skb); - atomic_inc(&vcc->stats->rx_err); - recycle_rx_buf(card, skb); - vc->rx_iov = NULL; - recycle_iov_buf(card, iovb); - return; - } - } - else /* NS_SKB(iovb)->iovcnt >= 2 */ - { - if (NS_SKB_CB(skb)->buf_type != BUF_LG) - { - printk("nicstar%d: Expected a large buffer, and this is not one.\n", - card->index); - which_list(card, skb); - atomic_inc(&vcc->stats->rx_err); - recycle_iovec_rx_bufs(card, (struct iovec *) iovb->data, - NS_SKB(iovb)->iovcnt); - vc->rx_iov = NULL; - recycle_iov_buf(card, iovb); - return; - } - } - - if (ns_rsqe_eopdu(rsqe)) - { - /* This works correctly regardless of the endianness of the host */ - unsigned char *L1L2 = (unsigned char *)((u32)skb->data + - iov->iov_len - 6); - aal5_len = L1L2[0] << 8 | L1L2[1]; - len = (aal5_len == 0x0000) ? 0x10000 : aal5_len; - if (ns_rsqe_crcerr(rsqe) || - len + 8 > iovb->len || len + (47 + 8) < iovb->len) - { - printk("nicstar%d: AAL5 CRC error", card->index); - if (len + 8 > iovb->len || len + (47 + 8) < iovb->len) - printk(" - PDU size mismatch.\n"); - else - printk(".\n"); - atomic_inc(&vcc->stats->rx_err); - recycle_iovec_rx_bufs(card, (struct iovec *) iovb->data, - NS_SKB(iovb)->iovcnt); - vc->rx_iov = NULL; - recycle_iov_buf(card, iovb); - return; - } - - /* By this point we (hopefully) have a complete SDU without errors. */ - - if (NS_SKB(iovb)->iovcnt == 1) /* Just a small buffer */ - { - /* skb points to a small buffer */ - if (!atm_charge(vcc, skb->truesize)) - { - push_rxbufs(card, skb); - atomic_inc(&vcc->stats->rx_drop); - } - else - { - skb_put(skb, len); - dequeue_sm_buf(card, skb); + if (ns_rsqe_eopdu(rsqe)) { + /* This works correctly regardless of the endianness of the host */ + unsigned char *L1L2 = (unsigned char *) + (skb->data + iov->iov_len - 6); + aal5_len = L1L2[0] << 8 | L1L2[1]; + len = (aal5_len == 0x0000) ? 0x10000 : aal5_len; + if (ns_rsqe_crcerr(rsqe) || + len + 8 > iovb->len || len + (47 + 8) < iovb->len) { + printk("nicstar%d: AAL5 CRC error", card->index); + if (len + 8 > iovb->len || len + (47 + 8) < iovb->len) + printk(" - PDU size mismatch.\n"); + else + printk(".\n"); + atomic_inc(&vcc->stats->rx_err); + recycle_iovec_rx_bufs(card, (struct iovec *)iovb->data, + NS_PRV_IOVCNT(iovb)); + vc->rx_iov = NULL; + recycle_iov_buf(card, iovb); + return; + } + + /* By this point we (hopefully) have a complete SDU without errors. */ + + if (NS_PRV_IOVCNT(iovb) == 1) { /* Just a small buffer */ + /* skb points to a small buffer */ + if (!atm_charge(vcc, skb->truesize)) { + push_rxbufs(card, skb); + atomic_inc(&vcc->stats->rx_drop); + } else { + skb_put(skb, len); + dequeue_sm_buf(card, skb); #ifdef NS_USE_DESTRUCTORS - skb->destructor = ns_sb_destructor; + skb->destructor = ns_sb_destructor; #endif /* NS_USE_DESTRUCTORS */ - ATM_SKB(skb)->vcc = vcc; - __net_timestamp(skb); - vcc->push(vcc, skb); - atomic_inc(&vcc->stats->rx); - } - } - else if (NS_SKB(iovb)->iovcnt == 2) /* One small plus one large buffer */ - { - struct sk_buff *sb; - - sb = (struct sk_buff *) (iov - 1)->iov_base; - /* skb points to a large buffer */ - - if (len <= NS_SMBUFSIZE) - { - if (!atm_charge(vcc, sb->truesize)) - { - push_rxbufs(card, sb); - atomic_inc(&vcc->stats->rx_drop); - } - else - { - skb_put(sb, len); - dequeue_sm_buf(card, sb); + ATM_SKB(skb)->vcc = vcc; + __net_timestamp(skb); + vcc->push(vcc, skb); + atomic_inc(&vcc->stats->rx); + } + } else if (NS_PRV_IOVCNT(iovb) == 2) { /* One small plus one large buffer */ + struct sk_buff *sb; + + sb = (struct sk_buff *)(iov - 1)->iov_base; + /* skb points to a large buffer */ + + if (len <= NS_SMBUFSIZE) { + if (!atm_charge(vcc, sb->truesize)) { + push_rxbufs(card, sb); + atomic_inc(&vcc->stats->rx_drop); + } else { + skb_put(sb, len); + dequeue_sm_buf(card, sb); #ifdef NS_USE_DESTRUCTORS - sb->destructor = ns_sb_destructor; + sb->destructor = ns_sb_destructor; #endif /* NS_USE_DESTRUCTORS */ - ATM_SKB(sb)->vcc = vcc; - __net_timestamp(sb); - vcc->push(vcc, sb); - atomic_inc(&vcc->stats->rx); - } - - push_rxbufs(card, skb); - - } - else /* len > NS_SMBUFSIZE, the usual case */ - { - if (!atm_charge(vcc, skb->truesize)) - { - push_rxbufs(card, skb); - atomic_inc(&vcc->stats->rx_drop); - } - else - { - dequeue_lg_buf(card, skb); + ATM_SKB(sb)->vcc = vcc; + __net_timestamp(sb); + vcc->push(vcc, sb); + atomic_inc(&vcc->stats->rx); + } + + push_rxbufs(card, skb); + + } else { /* len > NS_SMBUFSIZE, the usual case */ + + if (!atm_charge(vcc, skb->truesize)) { + push_rxbufs(card, skb); + atomic_inc(&vcc->stats->rx_drop); + } else { + dequeue_lg_buf(card, skb); #ifdef NS_USE_DESTRUCTORS - skb->destructor = ns_lb_destructor; + skb->destructor = ns_lb_destructor; #endif /* NS_USE_DESTRUCTORS */ - skb_push(skb, NS_SMBUFSIZE); - skb_copy_from_linear_data(sb, skb->data, NS_SMBUFSIZE); - skb_put(skb, len - NS_SMBUFSIZE); - ATM_SKB(skb)->vcc = vcc; - __net_timestamp(skb); - vcc->push(vcc, skb); - atomic_inc(&vcc->stats->rx); - } - - push_rxbufs(card, sb); - - } - - } - else /* Must push a huge buffer */ - { - struct sk_buff *hb, *sb, *lb; - int remaining, tocopy; - int j; - - hb = skb_dequeue(&(card->hbpool.queue)); - if (hb == NULL) /* No buffers in the queue */ - { - - hb = dev_alloc_skb(NS_HBUFSIZE); - if (hb == NULL) - { - printk("nicstar%d: Out of huge buffers.\n", card->index); - atomic_inc(&vcc->stats->rx_drop); - recycle_iovec_rx_bufs(card, (struct iovec *) iovb->data, - NS_SKB(iovb)->iovcnt); - vc->rx_iov = NULL; - recycle_iov_buf(card, iovb); - return; - } - else if (card->hbpool.count < card->hbnr.min) - { - struct sk_buff *new_hb; - if ((new_hb = dev_alloc_skb(NS_HBUFSIZE)) != NULL) - { - skb_queue_tail(&card->hbpool.queue, new_hb); - card->hbpool.count++; - } - } - NS_SKB_CB(hb)->buf_type = BUF_NONE; - } - else - if (--card->hbpool.count < card->hbnr.min) - { - struct sk_buff *new_hb; - if ((new_hb = dev_alloc_skb(NS_HBUFSIZE)) != NULL) - { - NS_SKB_CB(new_hb)->buf_type = BUF_NONE; - skb_queue_tail(&card->hbpool.queue, new_hb); - card->hbpool.count++; - } - if (card->hbpool.count < card->hbnr.min) - { - if ((new_hb = dev_alloc_skb(NS_HBUFSIZE)) != NULL) - { - NS_SKB_CB(new_hb)->buf_type = BUF_NONE; - skb_queue_tail(&card->hbpool.queue, new_hb); - card->hbpool.count++; - } - } - } - - iov = (struct iovec *) iovb->data; - - if (!atm_charge(vcc, hb->truesize)) - { - recycle_iovec_rx_bufs(card, iov, NS_SKB(iovb)->iovcnt); - if (card->hbpool.count < card->hbnr.max) - { - skb_queue_tail(&card->hbpool.queue, hb); - card->hbpool.count++; - } - else - dev_kfree_skb_any(hb); - atomic_inc(&vcc->stats->rx_drop); - } - else - { - /* Copy the small buffer to the huge buffer */ - sb = (struct sk_buff *) iov->iov_base; - skb_copy_from_linear_data(sb, hb->data, iov->iov_len); - skb_put(hb, iov->iov_len); - remaining = len - iov->iov_len; - iov++; - /* Free the small buffer */ - push_rxbufs(card, sb); - - /* Copy all large buffers to the huge buffer and free them */ - for (j = 1; j < NS_SKB(iovb)->iovcnt; j++) - { - lb = (struct sk_buff *) iov->iov_base; - tocopy = min_t(int, remaining, iov->iov_len); - skb_copy_from_linear_data(lb, skb_tail_pointer(hb), tocopy); - skb_put(hb, tocopy); - iov++; - remaining -= tocopy; - push_rxbufs(card, lb); - } + skb_push(skb, NS_SMBUFSIZE); + skb_copy_from_linear_data(sb, skb->data, + NS_SMBUFSIZE); + skb_put(skb, len - NS_SMBUFSIZE); + ATM_SKB(skb)->vcc = vcc; + __net_timestamp(skb); + vcc->push(vcc, skb); + atomic_inc(&vcc->stats->rx); + } + + push_rxbufs(card, sb); + + } + + } else { /* Must push a huge buffer */ + + struct sk_buff *hb, *sb, *lb; + int remaining, tocopy; + int j; + + hb = skb_dequeue(&(card->hbpool.queue)); + if (hb == NULL) { /* No buffers in the queue */ + + hb = dev_alloc_skb(NS_HBUFSIZE); + if (hb == NULL) { + printk + ("nicstar%d: Out of huge buffers.\n", + card->index); + atomic_inc(&vcc->stats->rx_drop); + recycle_iovec_rx_bufs(card, + (struct iovec *) + iovb->data, + NS_PRV_IOVCNT(iovb)); + vc->rx_iov = NULL; + recycle_iov_buf(card, iovb); + return; + } else if (card->hbpool.count < card->hbnr.min) { + struct sk_buff *new_hb; + if ((new_hb = + dev_alloc_skb(NS_HBUFSIZE)) != + NULL) { + skb_queue_tail(&card->hbpool. + queue, new_hb); + card->hbpool.count++; + } + } + NS_PRV_BUFTYPE(hb) = BUF_NONE; + } else if (--card->hbpool.count < card->hbnr.min) { + struct sk_buff *new_hb; + if ((new_hb = + dev_alloc_skb(NS_HBUFSIZE)) != NULL) { + NS_PRV_BUFTYPE(new_hb) = BUF_NONE; + skb_queue_tail(&card->hbpool.queue, + new_hb); + card->hbpool.count++; + } + if (card->hbpool.count < card->hbnr.min) { + if ((new_hb = + dev_alloc_skb(NS_HBUFSIZE)) != + NULL) { + NS_PRV_BUFTYPE(new_hb) = + BUF_NONE; + skb_queue_tail(&card->hbpool. + queue, new_hb); + card->hbpool.count++; + } + } + } + + iov = (struct iovec *)iovb->data; + + if (!atm_charge(vcc, hb->truesize)) { + recycle_iovec_rx_bufs(card, iov, + NS_PRV_IOVCNT(iovb)); + if (card->hbpool.count < card->hbnr.max) { + skb_queue_tail(&card->hbpool.queue, hb); + card->hbpool.count++; + } else + dev_kfree_skb_any(hb); + atomic_inc(&vcc->stats->rx_drop); + } else { + /* Copy the small buffer to the huge buffer */ + sb = (struct sk_buff *)iov->iov_base; + skb_copy_from_linear_data(sb, hb->data, + iov->iov_len); + skb_put(hb, iov->iov_len); + remaining = len - iov->iov_len; + iov++; + /* Free the small buffer */ + push_rxbufs(card, sb); + + /* Copy all large buffers to the huge buffer and free them */ + for (j = 1; j < NS_PRV_IOVCNT(iovb); j++) { + lb = (struct sk_buff *)iov->iov_base; + tocopy = + min_t(int, remaining, iov->iov_len); + skb_copy_from_linear_data(lb, + skb_tail_pointer + (hb), tocopy); + skb_put(hb, tocopy); + iov++; + remaining -= tocopy; + push_rxbufs(card, lb); + } #ifdef EXTRA_DEBUG - if (remaining != 0 || hb->len != len) - printk("nicstar%d: Huge buffer len mismatch.\n", card->index); + if (remaining != 0 || hb->len != len) + printk + ("nicstar%d: Huge buffer len mismatch.\n", + card->index); #endif /* EXTRA_DEBUG */ - ATM_SKB(hb)->vcc = vcc; + ATM_SKB(hb)->vcc = vcc; #ifdef NS_USE_DESTRUCTORS - hb->destructor = ns_hb_destructor; + hb->destructor = ns_hb_destructor; #endif /* NS_USE_DESTRUCTORS */ - __net_timestamp(hb); - vcc->push(vcc, hb); - atomic_inc(&vcc->stats->rx); - } - } + __net_timestamp(hb); + vcc->push(vcc, hb); + atomic_inc(&vcc->stats->rx); + } + } - vc->rx_iov = NULL; - recycle_iov_buf(card, iovb); - } + vc->rx_iov = NULL; + recycle_iov_buf(card, iovb); + } } - - #ifdef NS_USE_DESTRUCTORS static void ns_sb_destructor(struct sk_buff *sb) { - ns_dev *card; - u32 stat; - - card = (ns_dev *) ATM_SKB(sb)->vcc->dev->dev_data; - stat = readl(card->membase + STAT); - card->sbfqc = ns_stat_sfbqc_get(stat); - card->lbfqc = ns_stat_lfbqc_get(stat); - - do - { - sb = __dev_alloc_skb(NS_SMSKBSIZE, GFP_KERNEL); - if (sb == NULL) - break; - NS_SKB_CB(sb)->buf_type = BUF_SM; - skb_queue_tail(&card->sbpool.queue, sb); - skb_reserve(sb, NS_AAL0_HEADER); - push_rxbufs(card, sb); - } while (card->sbfqc < card->sbnr.min); + ns_dev *card; + u32 stat; + + card = (ns_dev *) ATM_SKB(sb)->vcc->dev->dev_data; + stat = readl(card->membase + STAT); + card->sbfqc = ns_stat_sfbqc_get(stat); + card->lbfqc = ns_stat_lfbqc_get(stat); + + do { + sb = __dev_alloc_skb(NS_SMSKBSIZE, GFP_KERNEL); + if (sb == NULL) + break; + NS_PRV_BUFTYPE(sb) = BUF_SM; + skb_queue_tail(&card->sbpool.queue, sb); + skb_reserve(sb, NS_AAL0_HEADER); + push_rxbufs(card, sb); + } while (card->sbfqc < card->sbnr.min); } - - static void ns_lb_destructor(struct sk_buff *lb) { - ns_dev *card; - u32 stat; - - card = (ns_dev *) ATM_SKB(lb)->vcc->dev->dev_data; - stat = readl(card->membase + STAT); - card->sbfqc = ns_stat_sfbqc_get(stat); - card->lbfqc = ns_stat_lfbqc_get(stat); - - do - { - lb = __dev_alloc_skb(NS_LGSKBSIZE, GFP_KERNEL); - if (lb == NULL) - break; - NS_SKB_CB(lb)->buf_type = BUF_LG; - skb_queue_tail(&card->lbpool.queue, lb); - skb_reserve(lb, NS_SMBUFSIZE); - push_rxbufs(card, lb); - } while (card->lbfqc < card->lbnr.min); + ns_dev *card; + u32 stat; + + card = (ns_dev *) ATM_SKB(lb)->vcc->dev->dev_data; + stat = readl(card->membase + STAT); + card->sbfqc = ns_stat_sfbqc_get(stat); + card->lbfqc = ns_stat_lfbqc_get(stat); + + do { + lb = __dev_alloc_skb(NS_LGSKBSIZE, GFP_KERNEL); + if (lb == NULL) + break; + NS_PRV_BUFTYPE(lb) = BUF_LG; + skb_queue_tail(&card->lbpool.queue, lb); + skb_reserve(lb, NS_SMBUFSIZE); + push_rxbufs(card, lb); + } while (card->lbfqc < card->lbnr.min); } - - static void ns_hb_destructor(struct sk_buff *hb) { - ns_dev *card; - - card = (ns_dev *) ATM_SKB(hb)->vcc->dev->dev_data; - - while (card->hbpool.count < card->hbnr.init) - { - hb = __dev_alloc_skb(NS_HBUFSIZE, GFP_KERNEL); - if (hb == NULL) - break; - NS_SKB_CB(hb)->buf_type = BUF_NONE; - skb_queue_tail(&card->hbpool.queue, hb); - card->hbpool.count++; - } + ns_dev *card; + + card = (ns_dev *) ATM_SKB(hb)->vcc->dev->dev_data; + + while (card->hbpool.count < card->hbnr.init) { + hb = __dev_alloc_skb(NS_HBUFSIZE, GFP_KERNEL); + if (hb == NULL) + break; + NS_PRV_BUFTYPE(hb) = BUF_NONE; + skb_queue_tail(&card->hbpool.queue, hb); + card->hbpool.count++; + } } #endif /* NS_USE_DESTRUCTORS */ - -static void recycle_rx_buf(ns_dev *card, struct sk_buff *skb) +static void recycle_rx_buf(ns_dev * card, struct sk_buff *skb) { - struct ns_skb_cb *cb = NS_SKB_CB(skb); - - if (unlikely(cb->buf_type == BUF_NONE)) { - printk("nicstar%d: What kind of rx buffer is this?\n", card->index); + if (unlikely(NS_PRV_BUFTYPE(skb) == BUF_NONE)) { + printk("nicstar%d: What kind of rx buffer is this?\n", + card->index); dev_kfree_skb_any(skb); } else push_rxbufs(card, skb); } - -static void recycle_iovec_rx_bufs(ns_dev *card, struct iovec *iov, int count) +static void recycle_iovec_rx_bufs(ns_dev * card, struct iovec *iov, int count) { while (count-- > 0) - recycle_rx_buf(card, (struct sk_buff *) (iov++)->iov_base); + recycle_rx_buf(card, (struct sk_buff *)(iov++)->iov_base); } - -static void recycle_iov_buf(ns_dev *card, struct sk_buff *iovb) +static void recycle_iov_buf(ns_dev * card, struct sk_buff *iovb) { - if (card->iovpool.count < card->iovnr.max) - { - skb_queue_tail(&card->iovpool.queue, iovb); - card->iovpool.count++; - } - else - dev_kfree_skb_any(iovb); + if (card->iovpool.count < card->iovnr.max) { + skb_queue_tail(&card->iovpool.queue, iovb); + card->iovpool.count++; + } else + dev_kfree_skb_any(iovb); } - - -static void dequeue_sm_buf(ns_dev *card, struct sk_buff *sb) +static void dequeue_sm_buf(ns_dev * card, struct sk_buff *sb) { - skb_unlink(sb, &card->sbpool.queue); + skb_unlink(sb, &card->sbpool.queue); #ifdef NS_USE_DESTRUCTORS - if (card->sbfqc < card->sbnr.min) + if (card->sbfqc < card->sbnr.min) #else - if (card->sbfqc < card->sbnr.init) - { - struct sk_buff *new_sb; - if ((new_sb = dev_alloc_skb(NS_SMSKBSIZE)) != NULL) - { - NS_SKB_CB(new_sb)->buf_type = BUF_SM; - skb_queue_tail(&card->sbpool.queue, new_sb); - skb_reserve(new_sb, NS_AAL0_HEADER); - push_rxbufs(card, new_sb); - } - } - if (card->sbfqc < card->sbnr.init) + if (card->sbfqc < card->sbnr.init) { + struct sk_buff *new_sb; + if ((new_sb = dev_alloc_skb(NS_SMSKBSIZE)) != NULL) { + NS_PRV_BUFTYPE(new_sb) = BUF_SM; + skb_queue_tail(&card->sbpool.queue, new_sb); + skb_reserve(new_sb, NS_AAL0_HEADER); + push_rxbufs(card, new_sb); + } + } + if (card->sbfqc < card->sbnr.init) #endif /* NS_USE_DESTRUCTORS */ - { - struct sk_buff *new_sb; - if ((new_sb = dev_alloc_skb(NS_SMSKBSIZE)) != NULL) - { - NS_SKB_CB(new_sb)->buf_type = BUF_SM; - skb_queue_tail(&card->sbpool.queue, new_sb); - skb_reserve(new_sb, NS_AAL0_HEADER); - push_rxbufs(card, new_sb); - } - } + { + struct sk_buff *new_sb; + if ((new_sb = dev_alloc_skb(NS_SMSKBSIZE)) != NULL) { + NS_PRV_BUFTYPE(new_sb) = BUF_SM; + skb_queue_tail(&card->sbpool.queue, new_sb); + skb_reserve(new_sb, NS_AAL0_HEADER); + push_rxbufs(card, new_sb); + } + } } - - -static void dequeue_lg_buf(ns_dev *card, struct sk_buff *lb) +static void dequeue_lg_buf(ns_dev * card, struct sk_buff *lb) { - skb_unlink(lb, &card->lbpool.queue); + skb_unlink(lb, &card->lbpool.queue); #ifdef NS_USE_DESTRUCTORS - if (card->lbfqc < card->lbnr.min) + if (card->lbfqc < card->lbnr.min) #else - if (card->lbfqc < card->lbnr.init) - { - struct sk_buff *new_lb; - if ((new_lb = dev_alloc_skb(NS_LGSKBSIZE)) != NULL) - { - NS_SKB_CB(new_lb)->buf_type = BUF_LG; - skb_queue_tail(&card->lbpool.queue, new_lb); - skb_reserve(new_lb, NS_SMBUFSIZE); - push_rxbufs(card, new_lb); - } - } - if (card->lbfqc < card->lbnr.init) + if (card->lbfqc < card->lbnr.init) { + struct sk_buff *new_lb; + if ((new_lb = dev_alloc_skb(NS_LGSKBSIZE)) != NULL) { + NS_PRV_BUFTYPE(new_lb) = BUF_LG; + skb_queue_tail(&card->lbpool.queue, new_lb); + skb_reserve(new_lb, NS_SMBUFSIZE); + push_rxbufs(card, new_lb); + } + } + if (card->lbfqc < card->lbnr.init) #endif /* NS_USE_DESTRUCTORS */ - { - struct sk_buff *new_lb; - if ((new_lb = dev_alloc_skb(NS_LGSKBSIZE)) != NULL) - { - NS_SKB_CB(new_lb)->buf_type = BUF_LG; - skb_queue_tail(&card->lbpool.queue, new_lb); - skb_reserve(new_lb, NS_SMBUFSIZE); - push_rxbufs(card, new_lb); - } - } + { + struct sk_buff *new_lb; + if ((new_lb = dev_alloc_skb(NS_LGSKBSIZE)) != NULL) { + NS_PRV_BUFTYPE(new_lb) = BUF_LG; + skb_queue_tail(&card->lbpool.queue, new_lb); + skb_reserve(new_lb, NS_SMBUFSIZE); + push_rxbufs(card, new_lb); + } + } } - - -static int ns_proc_read(struct atm_dev *dev, loff_t *pos, char *page) +static int ns_proc_read(struct atm_dev *dev, loff_t * pos, char *page) { - u32 stat; - ns_dev *card; - int left; - - left = (int) *pos; - card = (ns_dev *) dev->dev_data; - stat = readl(card->membase + STAT); - if (!left--) - return sprintf(page, "Pool count min init max \n"); - if (!left--) - return sprintf(page, "Small %5d %5d %5d %5d \n", - ns_stat_sfbqc_get(stat), card->sbnr.min, card->sbnr.init, - card->sbnr.max); - if (!left--) - return sprintf(page, "Large %5d %5d %5d %5d \n", - ns_stat_lfbqc_get(stat), card->lbnr.min, card->lbnr.init, - card->lbnr.max); - if (!left--) - return sprintf(page, "Huge %5d %5d %5d %5d \n", card->hbpool.count, - card->hbnr.min, card->hbnr.init, card->hbnr.max); - if (!left--) - return sprintf(page, "Iovec %5d %5d %5d %5d \n", card->iovpool.count, - card->iovnr.min, card->iovnr.init, card->iovnr.max); - if (!left--) - { - int retval; - retval = sprintf(page, "Interrupt counter: %u \n", card->intcnt); - card->intcnt = 0; - return retval; - } + u32 stat; + ns_dev *card; + int left; + + left = (int)*pos; + card = (ns_dev *) dev->dev_data; + stat = readl(card->membase + STAT); + if (!left--) + return sprintf(page, "Pool count min init max \n"); + if (!left--) + return sprintf(page, "Small %5d %5d %5d %5d \n", + ns_stat_sfbqc_get(stat), card->sbnr.min, + card->sbnr.init, card->sbnr.max); + if (!left--) + return sprintf(page, "Large %5d %5d %5d %5d \n", + ns_stat_lfbqc_get(stat), card->lbnr.min, + card->lbnr.init, card->lbnr.max); + if (!left--) + return sprintf(page, "Huge %5d %5d %5d %5d \n", + card->hbpool.count, card->hbnr.min, + card->hbnr.init, card->hbnr.max); + if (!left--) + return sprintf(page, "Iovec %5d %5d %5d %5d \n", + card->iovpool.count, card->iovnr.min, + card->iovnr.init, card->iovnr.max); + if (!left--) { + int retval; + retval = + sprintf(page, "Interrupt counter: %u \n", card->intcnt); + card->intcnt = 0; + return retval; + } #if 0 - /* Dump 25.6 Mbps PHY registers */ - /* Now there's a 25.6 Mbps PHY driver this code isn't needed. I left it - here just in case it's needed for debugging. */ - if (card->max_pcr == ATM_25_PCR && !left--) - { - u32 phy_regs[4]; - u32 i; - - for (i = 0; i < 4; i++) - { - while (CMD_BUSY(card)); - writel(NS_CMD_READ_UTILITY | 0x00000200 | i, card->membase + CMD); - while (CMD_BUSY(card)); - phy_regs[i] = readl(card->membase + DR0) & 0x000000FF; - } - - return sprintf(page, "PHY regs: 0x%02X 0x%02X 0x%02X 0x%02X \n", - phy_regs[0], phy_regs[1], phy_regs[2], phy_regs[3]); - } + /* Dump 25.6 Mbps PHY registers */ + /* Now there's a 25.6 Mbps PHY driver this code isn't needed. I left it + here just in case it's needed for debugging. */ + if (card->max_pcr == ATM_25_PCR && !left--) { + u32 phy_regs[4]; + u32 i; + + for (i = 0; i < 4; i++) { + while (CMD_BUSY(card)) ; + writel(NS_CMD_READ_UTILITY | 0x00000200 | i, + card->membase + CMD); + while (CMD_BUSY(card)) ; + phy_regs[i] = readl(card->membase + DR0) & 0x000000FF; + } + + return sprintf(page, "PHY regs: 0x%02X 0x%02X 0x%02X 0x%02X \n", + phy_regs[0], phy_regs[1], phy_regs[2], + phy_regs[3]); + } #endif /* 0 - Dump 25.6 Mbps PHY registers */ #if 0 - /* Dump TST */ - if (left-- < NS_TST_NUM_ENTRIES) - { - if (card->tste2vc[left + 1] == NULL) - return sprintf(page, "%5d - VBR/UBR \n", left + 1); - else - return sprintf(page, "%5d - %d %d \n", left + 1, - card->tste2vc[left + 1]->tx_vcc->vpi, - card->tste2vc[left + 1]->tx_vcc->vci); - } + /* Dump TST */ + if (left-- < NS_TST_NUM_ENTRIES) { + if (card->tste2vc[left + 1] == NULL) + return sprintf(page, "%5d - VBR/UBR \n", left + 1); + else + return sprintf(page, "%5d - %d %d \n", left + 1, + card->tste2vc[left + 1]->tx_vcc->vpi, + card->tste2vc[left + 1]->tx_vcc->vci); + } #endif /* 0 */ - return 0; + return 0; } - - -static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg) +static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user * arg) { - ns_dev *card; - pool_levels pl; - long btype; - unsigned long flags; - - card = dev->dev_data; - switch (cmd) - { - case NS_GETPSTAT: - if (get_user(pl.buftype, &((pool_levels __user *) arg)->buftype)) - return -EFAULT; - switch (pl.buftype) - { - case NS_BUFTYPE_SMALL: - pl.count = ns_stat_sfbqc_get(readl(card->membase + STAT)); - pl.level.min = card->sbnr.min; - pl.level.init = card->sbnr.init; - pl.level.max = card->sbnr.max; - break; - - case NS_BUFTYPE_LARGE: - pl.count = ns_stat_lfbqc_get(readl(card->membase + STAT)); - pl.level.min = card->lbnr.min; - pl.level.init = card->lbnr.init; - pl.level.max = card->lbnr.max; - break; - - case NS_BUFTYPE_HUGE: - pl.count = card->hbpool.count; - pl.level.min = card->hbnr.min; - pl.level.init = card->hbnr.init; - pl.level.max = card->hbnr.max; - break; - - case NS_BUFTYPE_IOVEC: - pl.count = card->iovpool.count; - pl.level.min = card->iovnr.min; - pl.level.init = card->iovnr.init; - pl.level.max = card->iovnr.max; - break; - - default: - return -ENOIOCTLCMD; - - } - if (!copy_to_user((pool_levels __user *) arg, &pl, sizeof(pl))) - return (sizeof(pl)); - else - return -EFAULT; - - case NS_SETBUFLEV: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - if (copy_from_user(&pl, (pool_levels __user *) arg, sizeof(pl))) - return -EFAULT; - if (pl.level.min >= pl.level.init || pl.level.init >= pl.level.max) - return -EINVAL; - if (pl.level.min == 0) - return -EINVAL; - switch (pl.buftype) - { - case NS_BUFTYPE_SMALL: - if (pl.level.max > TOP_SB) - return -EINVAL; - card->sbnr.min = pl.level.min; - card->sbnr.init = pl.level.init; - card->sbnr.max = pl.level.max; - break; - - case NS_BUFTYPE_LARGE: - if (pl.level.max > TOP_LB) - return -EINVAL; - card->lbnr.min = pl.level.min; - card->lbnr.init = pl.level.init; - card->lbnr.max = pl.level.max; - break; - - case NS_BUFTYPE_HUGE: - if (pl.level.max > TOP_HB) - return -EINVAL; - card->hbnr.min = pl.level.min; - card->hbnr.init = pl.level.init; - card->hbnr.max = pl.level.max; - break; - - case NS_BUFTYPE_IOVEC: - if (pl.level.max > TOP_IOVB) - return -EINVAL; - card->iovnr.min = pl.level.min; - card->iovnr.init = pl.level.init; - card->iovnr.max = pl.level.max; - break; - - default: - return -EINVAL; - - } - return 0; - - case NS_ADJBUFLEV: - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - btype = (long) arg; /* a long is the same size as a pointer or bigger */ - switch (btype) - { - case NS_BUFTYPE_SMALL: - while (card->sbfqc < card->sbnr.init) - { - struct sk_buff *sb; - - sb = __dev_alloc_skb(NS_SMSKBSIZE, GFP_KERNEL); - if (sb == NULL) - return -ENOMEM; - NS_SKB_CB(sb)->buf_type = BUF_SM; - skb_queue_tail(&card->sbpool.queue, sb); - skb_reserve(sb, NS_AAL0_HEADER); - push_rxbufs(card, sb); - } - break; - - case NS_BUFTYPE_LARGE: - while (card->lbfqc < card->lbnr.init) - { - struct sk_buff *lb; - - lb = __dev_alloc_skb(NS_LGSKBSIZE, GFP_KERNEL); - if (lb == NULL) - return -ENOMEM; - NS_SKB_CB(lb)->buf_type = BUF_LG; - skb_queue_tail(&card->lbpool.queue, lb); - skb_reserve(lb, NS_SMBUFSIZE); - push_rxbufs(card, lb); - } - break; - - case NS_BUFTYPE_HUGE: - while (card->hbpool.count > card->hbnr.init) - { - struct sk_buff *hb; - - ns_grab_int_lock(card, flags); - hb = skb_dequeue(&card->hbpool.queue); - card->hbpool.count--; - spin_unlock_irqrestore(&card->int_lock, flags); - if (hb == NULL) - printk("nicstar%d: huge buffer count inconsistent.\n", - card->index); - else - dev_kfree_skb_any(hb); - - } - while (card->hbpool.count < card->hbnr.init) - { - struct sk_buff *hb; - - hb = __dev_alloc_skb(NS_HBUFSIZE, GFP_KERNEL); - if (hb == NULL) - return -ENOMEM; - NS_SKB_CB(hb)->buf_type = BUF_NONE; - ns_grab_int_lock(card, flags); - skb_queue_tail(&card->hbpool.queue, hb); - card->hbpool.count++; - spin_unlock_irqrestore(&card->int_lock, flags); - } - break; - - case NS_BUFTYPE_IOVEC: - while (card->iovpool.count > card->iovnr.init) - { - struct sk_buff *iovb; - - ns_grab_int_lock(card, flags); - iovb = skb_dequeue(&card->iovpool.queue); - card->iovpool.count--; - spin_unlock_irqrestore(&card->int_lock, flags); - if (iovb == NULL) - printk("nicstar%d: iovec buffer count inconsistent.\n", - card->index); - else - dev_kfree_skb_any(iovb); - - } - while (card->iovpool.count < card->iovnr.init) - { - struct sk_buff *iovb; - - iovb = alloc_skb(NS_IOVBUFSIZE, GFP_KERNEL); - if (iovb == NULL) - return -ENOMEM; - NS_SKB_CB(iovb)->buf_type = BUF_NONE; - ns_grab_int_lock(card, flags); - skb_queue_tail(&card->iovpool.queue, iovb); - card->iovpool.count++; - spin_unlock_irqrestore(&card->int_lock, flags); - } - break; - - default: - return -EINVAL; - - } - return 0; - - default: - if (dev->phy && dev->phy->ioctl) { - return dev->phy->ioctl(dev, cmd, arg); - } - else { - printk("nicstar%d: %s == NULL \n", card->index, - dev->phy ? "dev->phy->ioctl" : "dev->phy"); - return -ENOIOCTLCMD; - } - } + ns_dev *card; + pool_levels pl; + long btype; + unsigned long flags; + + card = dev->dev_data; + switch (cmd) { + case NS_GETPSTAT: + if (get_user + (pl.buftype, &((pool_levels __user *) arg)->buftype)) + return -EFAULT; + switch (pl.buftype) { + case NS_BUFTYPE_SMALL: + pl.count = + ns_stat_sfbqc_get(readl(card->membase + STAT)); + pl.level.min = card->sbnr.min; + pl.level.init = card->sbnr.init; + pl.level.max = card->sbnr.max; + break; + + case NS_BUFTYPE_LARGE: + pl.count = + ns_stat_lfbqc_get(readl(card->membase + STAT)); + pl.level.min = card->lbnr.min; + pl.level.init = card->lbnr.init; + pl.level.max = card->lbnr.max; + break; + + case NS_BUFTYPE_HUGE: + pl.count = card->hbpool.count; + pl.level.min = card->hbnr.min; + pl.level.init = card->hbnr.init; + pl.level.max = card->hbnr.max; + break; + + case NS_BUFTYPE_IOVEC: + pl.count = card->iovpool.count; + pl.level.min = card->iovnr.min; + pl.level.init = card->iovnr.init; + pl.level.max = card->iovnr.max; + break; + + default: + return -ENOIOCTLCMD; + + } + if (!copy_to_user((pool_levels __user *) arg, &pl, sizeof(pl))) + return (sizeof(pl)); + else + return -EFAULT; + + case NS_SETBUFLEV: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + if (copy_from_user(&pl, (pool_levels __user *) arg, sizeof(pl))) + return -EFAULT; + if (pl.level.min >= pl.level.init + || pl.level.init >= pl.level.max) + return -EINVAL; + if (pl.level.min == 0) + return -EINVAL; + switch (pl.buftype) { + case NS_BUFTYPE_SMALL: + if (pl.level.max > TOP_SB) + return -EINVAL; + card->sbnr.min = pl.level.min; + card->sbnr.init = pl.level.init; + card->sbnr.max = pl.level.max; + break; + + case NS_BUFTYPE_LARGE: + if (pl.level.max > TOP_LB) + return -EINVAL; + card->lbnr.min = pl.level.min; + card->lbnr.init = pl.level.init; + card->lbnr.max = pl.level.max; + break; + + case NS_BUFTYPE_HUGE: + if (pl.level.max > TOP_HB) + return -EINVAL; + card->hbnr.min = pl.level.min; + card->hbnr.init = pl.level.init; + card->hbnr.max = pl.level.max; + break; + + case NS_BUFTYPE_IOVEC: + if (pl.level.max > TOP_IOVB) + return -EINVAL; + card->iovnr.min = pl.level.min; + card->iovnr.init = pl.level.init; + card->iovnr.max = pl.level.max; + break; + + default: + return -EINVAL; + + } + return 0; + + case NS_ADJBUFLEV: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + btype = (long)arg; /* a long is the same size as a pointer or bigger */ + switch (btype) { + case NS_BUFTYPE_SMALL: + while (card->sbfqc < card->sbnr.init) { + struct sk_buff *sb; + + sb = __dev_alloc_skb(NS_SMSKBSIZE, GFP_KERNEL); + if (sb == NULL) + return -ENOMEM; + NS_PRV_BUFTYPE(sb) = BUF_SM; + skb_queue_tail(&card->sbpool.queue, sb); + skb_reserve(sb, NS_AAL0_HEADER); + push_rxbufs(card, sb); + } + break; + + case NS_BUFTYPE_LARGE: + while (card->lbfqc < card->lbnr.init) { + struct sk_buff *lb; + + lb = __dev_alloc_skb(NS_LGSKBSIZE, GFP_KERNEL); + if (lb == NULL) + return -ENOMEM; + NS_PRV_BUFTYPE(lb) = BUF_LG; + skb_queue_tail(&card->lbpool.queue, lb); + skb_reserve(lb, NS_SMBUFSIZE); + push_rxbufs(card, lb); + } + break; + + case NS_BUFTYPE_HUGE: + while (card->hbpool.count > card->hbnr.init) { + struct sk_buff *hb; + + spin_lock_irqsave(&card->int_lock, flags); + hb = skb_dequeue(&card->hbpool.queue); + card->hbpool.count--; + spin_unlock_irqrestore(&card->int_lock, flags); + if (hb == NULL) + printk + ("nicstar%d: huge buffer count inconsistent.\n", + card->index); + else + dev_kfree_skb_any(hb); + + } + while (card->hbpool.count < card->hbnr.init) { + struct sk_buff *hb; + + hb = __dev_alloc_skb(NS_HBUFSIZE, GFP_KERNEL); + if (hb == NULL) + return -ENOMEM; + NS_PRV_BUFTYPE(hb) = BUF_NONE; + spin_lock_irqsave(&card->int_lock, flags); + skb_queue_tail(&card->hbpool.queue, hb); + card->hbpool.count++; + spin_unlock_irqrestore(&card->int_lock, flags); + } + break; + + case NS_BUFTYPE_IOVEC: + while (card->iovpool.count > card->iovnr.init) { + struct sk_buff *iovb; + + spin_lock_irqsave(&card->int_lock, flags); + iovb = skb_dequeue(&card->iovpool.queue); + card->iovpool.count--; + spin_unlock_irqrestore(&card->int_lock, flags); + if (iovb == NULL) + printk + ("nicstar%d: iovec buffer count inconsistent.\n", + card->index); + else + dev_kfree_skb_any(iovb); + + } + while (card->iovpool.count < card->iovnr.init) { + struct sk_buff *iovb; + + iovb = alloc_skb(NS_IOVBUFSIZE, GFP_KERNEL); + if (iovb == NULL) + return -ENOMEM; + NS_PRV_BUFTYPE(iovb) = BUF_NONE; + spin_lock_irqsave(&card->int_lock, flags); + skb_queue_tail(&card->iovpool.queue, iovb); + card->iovpool.count++; + spin_unlock_irqrestore(&card->int_lock, flags); + } + break; + + default: + return -EINVAL; + + } + return 0; + + default: + if (dev->phy && dev->phy->ioctl) { + return dev->phy->ioctl(dev, cmd, arg); + } else { + printk("nicstar%d: %s == NULL \n", card->index, + dev->phy ? "dev->phy->ioctl" : "dev->phy"); + return -ENOIOCTLCMD; + } + } } - -static void which_list(ns_dev *card, struct sk_buff *skb) +#ifdef EXTRA_DEBUG +static void which_list(ns_dev * card, struct sk_buff *skb) { - printk("skb buf_type: 0x%08x\n", NS_SKB_CB(skb)->buf_type); + printk("skb buf_type: 0x%08x\n", NS_PRV_BUFTYPE(skb)); } - +#endif /* EXTRA_DEBUG */ static void ns_poll(unsigned long arg) { - int i; - ns_dev *card; - unsigned long flags; - u32 stat_r, stat_w; - - PRINTK("nicstar: Entering ns_poll().\n"); - for (i = 0; i < num_cards; i++) - { - card = cards[i]; - if (spin_is_locked(&card->int_lock)) { - /* Probably it isn't worth spinning */ - continue; - } - ns_grab_int_lock(card, flags); - - stat_w = 0; - stat_r = readl(card->membase + STAT); - if (stat_r & NS_STAT_TSIF) - stat_w |= NS_STAT_TSIF; - if (stat_r & NS_STAT_EOPDU) - stat_w |= NS_STAT_EOPDU; - - process_tsq(card); - process_rsq(card); - - writel(stat_w, card->membase + STAT); - spin_unlock_irqrestore(&card->int_lock, flags); - } - mod_timer(&ns_timer, jiffies + NS_POLL_PERIOD); - PRINTK("nicstar: Leaving ns_poll().\n"); + int i; + ns_dev *card; + unsigned long flags; + u32 stat_r, stat_w; + + PRINTK("nicstar: Entering ns_poll().\n"); + for (i = 0; i < num_cards; i++) { + card = cards[i]; + if (spin_is_locked(&card->int_lock)) { + /* Probably it isn't worth spinning */ + continue; + } + spin_lock_irqsave(&card->int_lock, flags); + + stat_w = 0; + stat_r = readl(card->membase + STAT); + if (stat_r & NS_STAT_TSIF) + stat_w |= NS_STAT_TSIF; + if (stat_r & NS_STAT_EOPDU) + stat_w |= NS_STAT_EOPDU; + + process_tsq(card); + process_rsq(card); + + writel(stat_w, card->membase + STAT); + spin_unlock_irqrestore(&card->int_lock, flags); + } + mod_timer(&ns_timer, jiffies + NS_POLL_PERIOD); + PRINTK("nicstar: Leaving ns_poll().\n"); } - - -static int ns_parse_mac(char *mac, unsigned char *esi) -{ - int i, j; - short byte1, byte0; - - if (mac == NULL || esi == NULL) - return -1; - j = 0; - for (i = 0; i < 6; i++) - { - if ((byte1 = ns_h2i(mac[j++])) < 0) - return -1; - if ((byte0 = ns_h2i(mac[j++])) < 0) - return -1; - esi[i] = (unsigned char) (byte1 * 16 + byte0); - if (i < 5) - { - if (mac[j++] != ':') - return -1; - } - } - return 0; -} - - - -static short ns_h2i(char c) -{ - if (c >= '0' && c <= '9') - return (short) (c - '0'); - if (c >= 'A' && c <= 'F') - return (short) (c - 'A' + 10); - if (c >= 'a' && c <= 'f') - return (short) (c - 'a' + 10); - return -1; -} - - - static void ns_phy_put(struct atm_dev *dev, unsigned char value, - unsigned long addr) + unsigned long addr) { - ns_dev *card; - unsigned long flags; - - card = dev->dev_data; - ns_grab_res_lock(card, flags); - while(CMD_BUSY(card)); - writel((unsigned long) value, card->membase + DR0); - writel(NS_CMD_WRITE_UTILITY | 0x00000200 | (addr & 0x000000FF), - card->membase + CMD); - spin_unlock_irqrestore(&card->res_lock, flags); + ns_dev *card; + unsigned long flags; + + card = dev->dev_data; + spin_lock_irqsave(&card->res_lock, flags); + while (CMD_BUSY(card)) ; + writel((u32) value, card->membase + DR0); + writel(NS_CMD_WRITE_UTILITY | 0x00000200 | (addr & 0x000000FF), + card->membase + CMD); + spin_unlock_irqrestore(&card->res_lock, flags); } - - static unsigned char ns_phy_get(struct atm_dev *dev, unsigned long addr) { - ns_dev *card; - unsigned long flags; - unsigned long data; - - card = dev->dev_data; - ns_grab_res_lock(card, flags); - while(CMD_BUSY(card)); - writel(NS_CMD_READ_UTILITY | 0x00000200 | (addr & 0x000000FF), - card->membase + CMD); - while(CMD_BUSY(card)); - data = readl(card->membase + DR0) & 0x000000FF; - spin_unlock_irqrestore(&card->res_lock, flags); - return (unsigned char) data; + ns_dev *card; + unsigned long flags; + u32 data; + + card = dev->dev_data; + spin_lock_irqsave(&card->res_lock, flags); + while (CMD_BUSY(card)) ; + writel(NS_CMD_READ_UTILITY | 0x00000200 | (addr & 0x000000FF), + card->membase + CMD); + while (CMD_BUSY(card)) ; + data = readl(card->membase + DR0) & 0x000000FF; + spin_unlock_irqrestore(&card->res_lock, flags); + return (unsigned char)data; } - - module_init(nicstar_init); module_exit(nicstar_cleanup); diff --git a/drivers/atm/nicstar.h b/drivers/atm/nicstar.h index 5997bcb45b5..9bc27ea5088 100644 --- a/drivers/atm/nicstar.h +++ b/drivers/atm/nicstar.h @@ -1,5 +1,4 @@ -/****************************************************************************** - * +/* * nicstar.h * * Header file for the nicstar device driver. @@ -8,31 +7,26 @@ * PowerPC support by Jay Talbott (jay_talbott@mcg.mot.com) April 1999 * * (C) INESC 1998 - * - ******************************************************************************/ - + */ #ifndef _LINUX_NICSTAR_H_ #define _LINUX_NICSTAR_H_ - -/* Includes *******************************************************************/ +/* Includes */ #include <linux/types.h> #include <linux/pci.h> +#include <linux/idr.h> #include <linux/uio.h> #include <linux/skbuff.h> #include <linux/atmdev.h> #include <linux/atm_nicstar.h> - -/* Options ********************************************************************/ - -#undef NS_DEBUG_SPINLOCKS +/* Options */ #define NS_MAX_CARDS 4 /* Maximum number of NICStAR based cards controlled by the device driver. Must - be <= 5 */ + be <= 5 */ #undef RCQ_SUPPORT /* Do not define this for now */ @@ -45,7 +39,7 @@ #define NS_VPIBITS 2 /* 0, 1, 2, or 8 */ #define NS_MAX_RCTSIZE 4096 /* Number of entries. 4096 or 16384. - Define 4096 only if (all) your card(s) + Define 4096 only if (all) your card(s) have 32K x 32bit SRAM, in which case setting this to 16384 will just waste a lot of memory. @@ -53,33 +47,32 @@ 128K x 32bit SRAM will limit the maximum VCI. */ -/*#define NS_PCI_LATENCY 64*/ /* Must be a multiple of 32 */ + /*#define NS_PCI_LATENCY 64*//* Must be a multiple of 32 */ /* Number of buffers initially allocated */ -#define NUM_SB 32 /* Must be even */ -#define NUM_LB 24 /* Must be even */ -#define NUM_HB 8 /* Pre-allocated huge buffers */ -#define NUM_IOVB 48 /* Iovec buffers */ +#define NUM_SB 32 /* Must be even */ +#define NUM_LB 24 /* Must be even */ +#define NUM_HB 8 /* Pre-allocated huge buffers */ +#define NUM_IOVB 48 /* Iovec buffers */ /* Lower level for count of buffers */ -#define MIN_SB 8 /* Must be even */ -#define MIN_LB 8 /* Must be even */ +#define MIN_SB 8 /* Must be even */ +#define MIN_LB 8 /* Must be even */ #define MIN_HB 6 #define MIN_IOVB 8 /* Upper level for count of buffers */ -#define MAX_SB 64 /* Must be even, <= 508 */ -#define MAX_LB 48 /* Must be even, <= 508 */ +#define MAX_SB 64 /* Must be even, <= 508 */ +#define MAX_LB 48 /* Must be even, <= 508 */ #define MAX_HB 10 #define MAX_IOVB 80 /* These are the absolute maximum allowed for the ioctl() */ -#define TOP_SB 256 /* Must be even, <= 508 */ -#define TOP_LB 128 /* Must be even, <= 508 */ +#define TOP_SB 256 /* Must be even, <= 508 */ +#define TOP_LB 128 /* Must be even, <= 508 */ #define TOP_HB 64 #define TOP_IOVB 256 - #define MAX_TBD_PER_VC 1 /* Number of TBDs before a TSR */ #define MAX_TBD_PER_SCQ 10 /* Only meaningful for variable rate SCQs */ @@ -91,15 +84,12 @@ #define PCR_TOLERANCE (1.0001) - - -/* ESI stuff ******************************************************************/ +/* ESI stuff */ #define NICSTAR_EPROM_MAC_ADDR_OFFSET 0x6C #define NICSTAR_EPROM_MAC_ADDR_OFFSET_ALT 0xF6 - -/* #defines *******************************************************************/ +/* #defines */ #define NS_IOREMAP_SIZE 4096 @@ -125,22 +115,19 @@ #define NS_SMSKBSIZE (NS_SMBUFSIZE + NS_AAL0_HEADER) #define NS_LGSKBSIZE (NS_SMBUFSIZE + NS_LGBUFSIZE) +/* NICStAR structures located in host memory */ -/* NICStAR structures located in host memory **********************************/ - - - -/* RSQ - Receive Status Queue +/* + * RSQ - Receive Status Queue * * Written by the NICStAR, read by the device driver. */ -typedef struct ns_rsqe -{ - u32 word_1; - u32 buffer_handle; - u32 final_aal5_crc32; - u32 word_4; +typedef struct ns_rsqe { + u32 word_1; + u32 buffer_handle; + u32 final_aal5_crc32; + u32 word_4; } ns_rsqe; #define ns_rsqe_vpi(ns_rsqep) \ @@ -177,30 +164,27 @@ typedef struct ns_rsqe #define ns_rsqe_cellcount(ns_rsqep) \ (le32_to_cpu((ns_rsqep)->word_4) & 0x000001FF) #define ns_rsqe_init(ns_rsqep) \ - ((ns_rsqep)->word_4 = cpu_to_le32(0x00000000)) + ((ns_rsqep)->word_4 = cpu_to_le32(0x00000000)) #define NS_RSQ_NUM_ENTRIES (NS_RSQSIZE / 16) #define NS_RSQ_ALIGNMENT NS_RSQSIZE - - -/* RCQ - Raw Cell Queue +/* + * RCQ - Raw Cell Queue * * Written by the NICStAR, read by the device driver. */ -typedef struct cell_payload -{ - u32 word[12]; +typedef struct cell_payload { + u32 word[12]; } cell_payload; -typedef struct ns_rcqe -{ - u32 word_1; - u32 word_2; - u32 word_3; - u32 word_4; - cell_payload payload; +typedef struct ns_rcqe { + u32 word_1; + u32 word_2; + u32 word_3; + u32 word_4; + cell_payload payload; } ns_rcqe; #define NS_RCQE_SIZE 64 /* bytes */ @@ -212,28 +196,25 @@ typedef struct ns_rcqe #define ns_rcqe_nextbufhandle(ns_rcqep) \ (le32_to_cpu((ns_rcqep)->word_2)) - - -/* SCQ - Segmentation Channel Queue +/* + * SCQ - Segmentation Channel Queue * * Written by the device driver, read by the NICStAR. */ -typedef struct ns_scqe -{ - u32 word_1; - u32 word_2; - u32 word_3; - u32 word_4; +typedef struct ns_scqe { + u32 word_1; + u32 word_2; + u32 word_3; + u32 word_4; } ns_scqe; /* NOTE: SCQ entries can be either a TBD (Transmit Buffer Descriptors) - or TSR (Transmit Status Requests) */ + or TSR (Transmit Status Requests) */ #define NS_SCQE_TYPE_TBD 0x00000000 #define NS_SCQE_TYPE_TSR 0x80000000 - #define NS_TBD_EOPDU 0x40000000 #define NS_TBD_AAL0 0x00000000 #define NS_TBD_AAL34 0x04000000 @@ -255,10 +236,9 @@ typedef struct ns_scqe #define ns_tbd_mkword_4(gfc, vpi, vci, pt, clp) \ (cpu_to_le32((gfc) << 28 | (vpi) << 20 | (vci) << 4 | (pt) << 1 | (clp))) - #define NS_TSR_INTENABLE 0x20000000 -#define NS_TSR_SCDISVBR 0xFFFF /* Use as scdi for VBR SCD */ +#define NS_TSR_SCDISVBR 0xFFFF /* Use as scdi for VBR SCD */ #define ns_tsr_mkword_1(flags) \ (cpu_to_le32(NS_SCQE_TYPE_TSR | (flags))) @@ -275,22 +255,20 @@ typedef struct ns_scqe #define NS_SCQE_SIZE 16 - - -/* TSQ - Transmit Status Queue +/* + * TSQ - Transmit Status Queue * * Written by the NICStAR, read by the device driver. */ -typedef struct ns_tsi -{ - u32 word_1; - u32 word_2; +typedef struct ns_tsi { + u32 word_1; + u32 word_2; } ns_tsi; /* NOTE: The first word can be a status word copied from the TSR which - originated the TSI, or a timer overflow indicator. In this last - case, the value of the first word is all zeroes. */ + originated the TSI, or a timer overflow indicator. In this last + case, the value of the first word is all zeroes. */ #define NS_TSI_EMPTY 0x80000000 #define NS_TSI_TIMESTAMP_MASK 0x00FFFFFF @@ -303,12 +281,10 @@ typedef struct ns_tsi #define ns_tsi_init(ns_tsip) \ ((ns_tsip)->word_2 = cpu_to_le32(NS_TSI_EMPTY)) - #define NS_TSQSIZE 8192 #define NS_TSQ_NUM_ENTRIES 1024 #define NS_TSQ_ALIGNMENT 8192 - #define NS_TSI_SCDISVBR NS_TSR_SCDISVBR #define ns_tsi_tmrof(ns_tsip) \ @@ -318,26 +294,22 @@ typedef struct ns_tsi #define ns_tsi_getscqpos(ns_tsip) \ (le32_to_cpu((ns_tsip)->word_1) & 0x00007FFF) +/* NICStAR structures located in local SRAM */ - -/* NICStAR structures located in local SRAM ***********************************/ - - - -/* RCT - Receive Connection Table +/* + * RCT - Receive Connection Table * * Written by both the NICStAR and the device driver. */ -typedef struct ns_rcte -{ - u32 word_1; - u32 buffer_handle; - u32 dma_address; - u32 aal5_crc32; +typedef struct ns_rcte { + u32 word_1; + u32 buffer_handle; + u32 dma_address; + u32 aal5_crc32; } ns_rcte; -#define NS_RCTE_BSFB 0x00200000 /* Rev. D only */ +#define NS_RCTE_BSFB 0x00200000 /* Rev. D only */ #define NS_RCTE_NZGFC 0x00100000 #define NS_RCTE_CONNECTOPEN 0x00080000 #define NS_RCTE_AALMASK 0x00070000 @@ -360,25 +332,21 @@ typedef struct ns_rcte #define NS_RCT_ENTRY_SIZE 4 /* Number of dwords */ /* NOTE: We could make macros to contruct the first word of the RCTE, - but that doesn't seem to make much sense... */ + but that doesn't seem to make much sense... */ - - -/* FBD - Free Buffer Descriptor +/* + * FBD - Free Buffer Descriptor * * Written by the device driver using via the command register. */ -typedef struct ns_fbd -{ - u32 buffer_handle; - u32 dma_address; +typedef struct ns_fbd { + u32 buffer_handle; + u32 dma_address; } ns_fbd; - - - -/* TST - Transmit Schedule Table +/* + * TST - Transmit Schedule Table * * Written by the device driver. */ @@ -387,40 +355,38 @@ typedef u32 ns_tste; #define NS_TST_OPCODE_MASK 0x60000000 -#define NS_TST_OPCODE_NULL 0x00000000 /* Insert null cell */ -#define NS_TST_OPCODE_FIXED 0x20000000 /* Cell from a fixed rate channel */ +#define NS_TST_OPCODE_NULL 0x00000000 /* Insert null cell */ +#define NS_TST_OPCODE_FIXED 0x20000000 /* Cell from a fixed rate channel */ #define NS_TST_OPCODE_VARIABLE 0x40000000 -#define NS_TST_OPCODE_END 0x60000000 /* Jump */ +#define NS_TST_OPCODE_END 0x60000000 /* Jump */ #define ns_tste_make(opcode, sramad) (opcode | sramad) /* NOTE: - When the opcode is FIXED, sramad specifies the SRAM address of the - SCD for that fixed rate channel. + SCD for that fixed rate channel. - When the opcode is END, sramad specifies the SRAM address of the - location of the next TST entry to read. + location of the next TST entry to read. */ - - -/* SCD - Segmentation Channel Descriptor +/* + * SCD - Segmentation Channel Descriptor * * Written by both the device driver and the NICStAR */ -typedef struct ns_scd -{ - u32 word_1; - u32 word_2; - u32 partial_aal5_crc; - u32 reserved; - ns_scqe cache_a; - ns_scqe cache_b; +typedef struct ns_scd { + u32 word_1; + u32 word_2; + u32 partial_aal5_crc; + u32 reserved; + ns_scqe cache_a; + ns_scqe cache_b; } ns_scd; -#define NS_SCD_BASE_MASK_VAR 0xFFFFE000 /* Variable rate */ -#define NS_SCD_BASE_MASK_FIX 0xFFFFFC00 /* Fixed rate */ +#define NS_SCD_BASE_MASK_VAR 0xFFFFE000 /* Variable rate */ +#define NS_SCD_BASE_MASK_FIX 0xFFFFFC00 /* Fixed rate */ #define NS_SCD_TAIL_MASK_VAR 0x00001FF0 #define NS_SCD_TAIL_MASK_FIX 0x000003F0 #define NS_SCD_HEAD_MASK_VAR 0x00001FF0 @@ -428,13 +394,9 @@ typedef struct ns_scd #define NS_SCD_XMITFOREVER 0x02000000 /* NOTE: There are other fields in word 2 of the SCD, but as they should - not be needed in the device driver they are not defined here. */ - - - - -/* NICStAR local SRAM memory map **********************************************/ + not be needed in the device driver they are not defined here. */ +/* NICStAR local SRAM memory map */ #define NS_RCT 0x00000 #define NS_RCT_32_END 0x03FFF @@ -457,100 +419,93 @@ typedef struct ns_scd #define NS_LGFBQ 0x1FC00 #define NS_LGFBQ_END 0x1FFFF - - -/* NISCtAR operation registers ************************************************/ - +/* NISCtAR operation registers */ /* See Section 3.4 of `IDT77211 NICStAR User Manual' from www.idt.com */ -enum ns_regs -{ - DR0 = 0x00, /* Data Register 0 R/W*/ - DR1 = 0x04, /* Data Register 1 W */ - DR2 = 0x08, /* Data Register 2 W */ - DR3 = 0x0C, /* Data Register 3 W */ - CMD = 0x10, /* Command W */ - CFG = 0x14, /* Configuration R/W */ - STAT = 0x18, /* Status R/W */ - RSQB = 0x1C, /* Receive Status Queue Base W */ - RSQT = 0x20, /* Receive Status Queue Tail R */ - RSQH = 0x24, /* Receive Status Queue Head W */ - CDC = 0x28, /* Cell Drop Counter R/clear */ - VPEC = 0x2C, /* VPI/VCI Lookup Error Count R/clear */ - ICC = 0x30, /* Invalid Cell Count R/clear */ - RAWCT = 0x34, /* Raw Cell Tail R */ - TMR = 0x38, /* Timer R */ - TSTB = 0x3C, /* Transmit Schedule Table Base R/W */ - TSQB = 0x40, /* Transmit Status Queue Base W */ - TSQT = 0x44, /* Transmit Status Queue Tail R */ - TSQH = 0x48, /* Transmit Status Queue Head W */ - GP = 0x4C, /* General Purpose R/W */ - VPM = 0x50 /* VPI/VCI Mask W */ +enum ns_regs { + DR0 = 0x00, /* Data Register 0 R/W */ + DR1 = 0x04, /* Data Register 1 W */ + DR2 = 0x08, /* Data Register 2 W */ + DR3 = 0x0C, /* Data Register 3 W */ + CMD = 0x10, /* Command W */ + CFG = 0x14, /* Configuration R/W */ + STAT = 0x18, /* Status R/W */ + RSQB = 0x1C, /* Receive Status Queue Base W */ + RSQT = 0x20, /* Receive Status Queue Tail R */ + RSQH = 0x24, /* Receive Status Queue Head W */ + CDC = 0x28, /* Cell Drop Counter R/clear */ + VPEC = 0x2C, /* VPI/VCI Lookup Error Count R/clear */ + ICC = 0x30, /* Invalid Cell Count R/clear */ + RAWCT = 0x34, /* Raw Cell Tail R */ + TMR = 0x38, /* Timer R */ + TSTB = 0x3C, /* Transmit Schedule Table Base R/W */ + TSQB = 0x40, /* Transmit Status Queue Base W */ + TSQT = 0x44, /* Transmit Status Queue Tail R */ + TSQH = 0x48, /* Transmit Status Queue Head W */ + GP = 0x4C, /* General Purpose R/W */ + VPM = 0x50 /* VPI/VCI Mask W */ }; - -/* NICStAR commands issued to the CMD register ********************************/ - +/* NICStAR commands issued to the CMD register */ /* Top 4 bits are command opcode, lower 28 are parameters. */ #define NS_CMD_NO_OPERATION 0x00000000 - /* params always 0 */ + /* params always 0 */ #define NS_CMD_OPENCLOSE_CONNECTION 0x20000000 - /* b19{1=open,0=close} b18-2{SRAM addr} */ + /* b19{1=open,0=close} b18-2{SRAM addr} */ #define NS_CMD_WRITE_SRAM 0x40000000 - /* b18-2{SRAM addr} b1-0{burst size} */ + /* b18-2{SRAM addr} b1-0{burst size} */ #define NS_CMD_READ_SRAM 0x50000000 - /* b18-2{SRAM addr} */ + /* b18-2{SRAM addr} */ #define NS_CMD_WRITE_FREEBUFQ 0x60000000 - /* b0{large buf indicator} */ + /* b0{large buf indicator} */ #define NS_CMD_READ_UTILITY 0x80000000 - /* b8{1=select UTL_CS1} b9{1=select UTL_CS0} b7-0{bus addr} */ + /* b8{1=select UTL_CS1} b9{1=select UTL_CS0} b7-0{bus addr} */ #define NS_CMD_WRITE_UTILITY 0x90000000 - /* b8{1=select UTL_CS1} b9{1=select UTL_CS0} b7-0{bus addr} */ + /* b8{1=select UTL_CS1} b9{1=select UTL_CS0} b7-0{bus addr} */ #define NS_CMD_OPEN_CONNECTION (NS_CMD_OPENCLOSE_CONNECTION | 0x00080000) #define NS_CMD_CLOSE_CONNECTION NS_CMD_OPENCLOSE_CONNECTION - -/* NICStAR configuration bits *************************************************/ - -#define NS_CFG_SWRST 0x80000000 /* Software Reset */ -#define NS_CFG_RXPATH 0x20000000 /* Receive Path Enable */ -#define NS_CFG_SMBUFSIZE_MASK 0x18000000 /* Small Receive Buffer Size */ -#define NS_CFG_LGBUFSIZE_MASK 0x06000000 /* Large Receive Buffer Size */ -#define NS_CFG_EFBIE 0x01000000 /* Empty Free Buffer Queue - Interrupt Enable */ -#define NS_CFG_RSQSIZE_MASK 0x00C00000 /* Receive Status Queue Size */ -#define NS_CFG_ICACCEPT 0x00200000 /* Invalid Cell Accept */ -#define NS_CFG_IGNOREGFC 0x00100000 /* Ignore General Flow Control */ -#define NS_CFG_VPIBITS_MASK 0x000C0000 /* VPI/VCI Bits Size Select */ -#define NS_CFG_RCTSIZE_MASK 0x00030000 /* Receive Connection Table Size */ -#define NS_CFG_VCERRACCEPT 0x00008000 /* VPI/VCI Error Cell Accept */ -#define NS_CFG_RXINT_MASK 0x00007000 /* End of Receive PDU Interrupt - Handling */ -#define NS_CFG_RAWIE 0x00000800 /* Raw Cell Qu' Interrupt Enable */ -#define NS_CFG_RSQAFIE 0x00000400 /* Receive Queue Almost Full - Interrupt Enable */ -#define NS_CFG_RXRM 0x00000200 /* Receive RM Cells */ -#define NS_CFG_TMRROIE 0x00000080 /* Timer Roll Over Interrupt - Enable */ -#define NS_CFG_TXEN 0x00000020 /* Transmit Operation Enable */ -#define NS_CFG_TXIE 0x00000010 /* Transmit Status Interrupt - Enable */ -#define NS_CFG_TXURIE 0x00000008 /* Transmit Under-run Interrupt - Enable */ -#define NS_CFG_UMODE 0x00000004 /* Utopia Mode (cell/byte) Select */ -#define NS_CFG_TSQFIE 0x00000002 /* Transmit Status Queue Full - Interrupt Enable */ -#define NS_CFG_PHYIE 0x00000001 /* PHY Interrupt Enable */ +/* NICStAR configuration bits */ + +#define NS_CFG_SWRST 0x80000000 /* Software Reset */ +#define NS_CFG_RXPATH 0x20000000 /* Receive Path Enable */ +#define NS_CFG_SMBUFSIZE_MASK 0x18000000 /* Small Receive Buffer Size */ +#define NS_CFG_LGBUFSIZE_MASK 0x06000000 /* Large Receive Buffer Size */ +#define NS_CFG_EFBIE 0x01000000 /* Empty Free Buffer Queue + Interrupt Enable */ +#define NS_CFG_RSQSIZE_MASK 0x00C00000 /* Receive Status Queue Size */ +#define NS_CFG_ICACCEPT 0x00200000 /* Invalid Cell Accept */ +#define NS_CFG_IGNOREGFC 0x00100000 /* Ignore General Flow Control */ +#define NS_CFG_VPIBITS_MASK 0x000C0000 /* VPI/VCI Bits Size Select */ +#define NS_CFG_RCTSIZE_MASK 0x00030000 /* Receive Connection Table Size */ +#define NS_CFG_VCERRACCEPT 0x00008000 /* VPI/VCI Error Cell Accept */ +#define NS_CFG_RXINT_MASK 0x00007000 /* End of Receive PDU Interrupt + Handling */ +#define NS_CFG_RAWIE 0x00000800 /* Raw Cell Qu' Interrupt Enable */ +#define NS_CFG_RSQAFIE 0x00000400 /* Receive Queue Almost Full + Interrupt Enable */ +#define NS_CFG_RXRM 0x00000200 /* Receive RM Cells */ +#define NS_CFG_TMRROIE 0x00000080 /* Timer Roll Over Interrupt + Enable */ +#define NS_CFG_TXEN 0x00000020 /* Transmit Operation Enable */ +#define NS_CFG_TXIE 0x00000010 /* Transmit Status Interrupt + Enable */ +#define NS_CFG_TXURIE 0x00000008 /* Transmit Under-run Interrupt + Enable */ +#define NS_CFG_UMODE 0x00000004 /* Utopia Mode (cell/byte) Select */ +#define NS_CFG_TSQFIE 0x00000002 /* Transmit Status Queue Full + Interrupt Enable */ +#define NS_CFG_PHYIE 0x00000001 /* PHY Interrupt Enable */ #define NS_CFG_SMBUFSIZE_48 0x00000000 #define NS_CFG_SMBUFSIZE_96 0x08000000 @@ -581,33 +536,29 @@ enum ns_regs #define NS_CFG_RXINT_624US 0x00003000 #define NS_CFG_RXINT_899US 0x00004000 - -/* NICStAR STATus bits ********************************************************/ - -#define NS_STAT_SFBQC_MASK 0xFF000000 /* hi 8 bits Small Buffer Queue Count */ -#define NS_STAT_LFBQC_MASK 0x00FF0000 /* hi 8 bits Large Buffer Queue Count */ -#define NS_STAT_TSIF 0x00008000 /* Transmit Status Queue Indicator */ -#define NS_STAT_TXICP 0x00004000 /* Transmit Incomplete PDU */ -#define NS_STAT_TSQF 0x00001000 /* Transmit Status Queue Full */ -#define NS_STAT_TMROF 0x00000800 /* Timer Overflow */ -#define NS_STAT_PHYI 0x00000400 /* PHY Device Interrupt */ -#define NS_STAT_CMDBZ 0x00000200 /* Command Busy */ -#define NS_STAT_SFBQF 0x00000100 /* Small Buffer Queue Full */ -#define NS_STAT_LFBQF 0x00000080 /* Large Buffer Queue Full */ -#define NS_STAT_RSQF 0x00000040 /* Receive Status Queue Full */ -#define NS_STAT_EOPDU 0x00000020 /* End of PDU */ -#define NS_STAT_RAWCF 0x00000010 /* Raw Cell Flag */ -#define NS_STAT_SFBQE 0x00000008 /* Small Buffer Queue Empty */ -#define NS_STAT_LFBQE 0x00000004 /* Large Buffer Queue Empty */ -#define NS_STAT_RSQAF 0x00000002 /* Receive Status Queue Almost Full */ +/* NICStAR STATus bits */ + +#define NS_STAT_SFBQC_MASK 0xFF000000 /* hi 8 bits Small Buffer Queue Count */ +#define NS_STAT_LFBQC_MASK 0x00FF0000 /* hi 8 bits Large Buffer Queue Count */ +#define NS_STAT_TSIF 0x00008000 /* Transmit Status Queue Indicator */ +#define NS_STAT_TXICP 0x00004000 /* Transmit Incomplete PDU */ +#define NS_STAT_TSQF 0x00001000 /* Transmit Status Queue Full */ +#define NS_STAT_TMROF 0x00000800 /* Timer Overflow */ +#define NS_STAT_PHYI 0x00000400 /* PHY Device Interrupt */ +#define NS_STAT_CMDBZ 0x00000200 /* Command Busy */ +#define NS_STAT_SFBQF 0x00000100 /* Small Buffer Queue Full */ +#define NS_STAT_LFBQF 0x00000080 /* Large Buffer Queue Full */ +#define NS_STAT_RSQF 0x00000040 /* Receive Status Queue Full */ +#define NS_STAT_EOPDU 0x00000020 /* End of PDU */ +#define NS_STAT_RAWCF 0x00000010 /* Raw Cell Flag */ +#define NS_STAT_SFBQE 0x00000008 /* Small Buffer Queue Empty */ +#define NS_STAT_LFBQE 0x00000004 /* Large Buffer Queue Empty */ +#define NS_STAT_RSQAF 0x00000002 /* Receive Status Queue Almost Full */ #define ns_stat_sfbqc_get(stat) (((stat) & NS_STAT_SFBQC_MASK) >> 23) #define ns_stat_lfbqc_get(stat) (((stat) & NS_STAT_LFBQC_MASK) >> 15) - - -/* #defines which depend on other #defines ************************************/ - +/* #defines which depend on other #defines */ #define NS_TST0 NS_TST_FRSCD #define NS_TST1 (NS_TST_FRSCD + NS_TST_NUM_ENTRIES + 1) @@ -674,8 +625,7 @@ enum ns_regs #define NS_CFG_TSQFIE_OPT 0x00000000 #endif /* ENABLE_TSQFIE */ - -/* PCI stuff ******************************************************************/ +/* PCI stuff */ #ifndef PCI_VENDOR_ID_IDT #define PCI_VENDOR_ID_IDT 0x111D @@ -685,148 +635,124 @@ enum ns_regs #define PCI_DEVICE_ID_IDT_IDT77201 0x0001 #endif /* PCI_DEVICE_ID_IDT_IDT77201 */ +/* Device driver structures */ - -/* Device driver structures ***************************************************/ - - -struct ns_skb_cb { - u32 buf_type; /* BUF_SM/BUF_LG/BUF_NONE */ +struct ns_skb_prv { + u32 buf_type; /* BUF_SM/BUF_LG/BUF_NONE */ + u32 dma; + int iovcnt; }; -#define NS_SKB_CB(skb) ((struct ns_skb_cb *)((skb)->cb)) - -typedef struct tsq_info -{ - void *org; - ns_tsi *base; - ns_tsi *next; - ns_tsi *last; +#define NS_PRV_BUFTYPE(skb) \ + (((struct ns_skb_prv *)(ATM_SKB(skb)+1))->buf_type) +#define NS_PRV_DMA(skb) \ + (((struct ns_skb_prv *)(ATM_SKB(skb)+1))->dma) +#define NS_PRV_IOVCNT(skb) \ + (((struct ns_skb_prv *)(ATM_SKB(skb)+1))->iovcnt) + +typedef struct tsq_info { + void *org; + dma_addr_t dma; + ns_tsi *base; + ns_tsi *next; + ns_tsi *last; } tsq_info; - -typedef struct scq_info -{ - void *org; - ns_scqe *base; - ns_scqe *last; - ns_scqe *next; - volatile ns_scqe *tail; /* Not related to the nicstar register */ - unsigned num_entries; - struct sk_buff **skb; /* Pointer to an array of pointers - to the sk_buffs used for tx */ - u32 scd; /* SRAM address of the corresponding - SCD */ - int tbd_count; /* Only meaningful on variable rate */ - wait_queue_head_t scqfull_waitq; - volatile char full; /* SCQ full indicator */ - spinlock_t lock; /* SCQ spinlock */ -#ifdef NS_DEBUG_SPINLOCKS - volatile long has_lock; - volatile int cpu_lock; -#endif /* NS_DEBUG_SPINLOCKS */ +typedef struct scq_info { + void *org; + dma_addr_t dma; + ns_scqe *base; + ns_scqe *last; + ns_scqe *next; + volatile ns_scqe *tail; /* Not related to the nicstar register */ + unsigned num_entries; + struct sk_buff **skb; /* Pointer to an array of pointers + to the sk_buffs used for tx */ + u32 scd; /* SRAM address of the corresponding + SCD */ + int tbd_count; /* Only meaningful on variable rate */ + wait_queue_head_t scqfull_waitq; + volatile char full; /* SCQ full indicator */ + spinlock_t lock; /* SCQ spinlock */ } scq_info; - - -typedef struct rsq_info -{ - void *org; - ns_rsqe *base; - ns_rsqe *next; - ns_rsqe *last; +typedef struct rsq_info { + void *org; + dma_addr_t dma; + ns_rsqe *base; + ns_rsqe *next; + ns_rsqe *last; } rsq_info; - -typedef struct skb_pool -{ - volatile int count; /* number of buffers in the queue */ - struct sk_buff_head queue; +typedef struct skb_pool { + volatile int count; /* number of buffers in the queue */ + struct sk_buff_head queue; } skb_pool; /* NOTE: for small and large buffer pools, the count is not used, as the actual value used for buffer management is the one read from the card. */ - -typedef struct vc_map -{ - volatile unsigned int tx:1; /* TX vc? */ - volatile unsigned int rx:1; /* RX vc? */ - struct atm_vcc *tx_vcc, *rx_vcc; - struct sk_buff *rx_iov; /* RX iovector skb */ - scq_info *scq; /* To keep track of the SCQ */ - u32 cbr_scd; /* SRAM address of the corresponding - SCD. 0x00000000 for UBR/VBR/ABR */ - int tbd_count; +typedef struct vc_map { + volatile unsigned int tx:1; /* TX vc? */ + volatile unsigned int rx:1; /* RX vc? */ + struct atm_vcc *tx_vcc, *rx_vcc; + struct sk_buff *rx_iov; /* RX iovector skb */ + scq_info *scq; /* To keep track of the SCQ */ + u32 cbr_scd; /* SRAM address of the corresponding + SCD. 0x00000000 for UBR/VBR/ABR */ + int tbd_count; } vc_map; - -struct ns_skb_data -{ - struct atm_vcc *vcc; - int iovcnt; -}; - -#define NS_SKB(skb) (((struct ns_skb_data *) (skb)->cb)) - - -typedef struct ns_dev -{ - int index; /* Card ID to the device driver */ - int sram_size; /* In k x 32bit words. 32 or 128 */ - void __iomem *membase; /* Card's memory base address */ - unsigned long max_pcr; - int rct_size; /* Number of entries */ - int vpibits; - int vcibits; - struct pci_dev *pcidev; - struct atm_dev *atmdev; - tsq_info tsq; - rsq_info rsq; - scq_info *scq0, *scq1, *scq2; /* VBR SCQs */ - skb_pool sbpool; /* Small buffers */ - skb_pool lbpool; /* Large buffers */ - skb_pool hbpool; /* Pre-allocated huge buffers */ - skb_pool iovpool; /* iovector buffers */ - volatile int efbie; /* Empty free buf. queue int. enabled */ - volatile u32 tst_addr; /* SRAM address of the TST in use */ - volatile int tst_free_entries; - vc_map vcmap[NS_MAX_RCTSIZE]; - vc_map *tste2vc[NS_TST_NUM_ENTRIES]; - vc_map *scd2vc[NS_FRSCD_NUM]; - buf_nr sbnr; - buf_nr lbnr; - buf_nr hbnr; - buf_nr iovnr; - int sbfqc; - int lbfqc; - u32 sm_handle; - u32 sm_addr; - u32 lg_handle; - u32 lg_addr; - struct sk_buff *rcbuf; /* Current raw cell buffer */ - u32 rawch; /* Raw cell queue head */ - unsigned intcnt; /* Interrupt counter */ - spinlock_t int_lock; /* Interrupt lock */ - spinlock_t res_lock; /* Card resource lock */ -#ifdef NS_DEBUG_SPINLOCKS - volatile long has_int_lock; - volatile int cpu_int; - volatile long has_res_lock; - volatile int cpu_res; -#endif /* NS_DEBUG_SPINLOCKS */ +typedef struct ns_dev { + int index; /* Card ID to the device driver */ + int sram_size; /* In k x 32bit words. 32 or 128 */ + void __iomem *membase; /* Card's memory base address */ + unsigned long max_pcr; + int rct_size; /* Number of entries */ + int vpibits; + int vcibits; + struct pci_dev *pcidev; + struct idr idr; + struct atm_dev *atmdev; + tsq_info tsq; + rsq_info rsq; + scq_info *scq0, *scq1, *scq2; /* VBR SCQs */ + skb_pool sbpool; /* Small buffers */ + skb_pool lbpool; /* Large buffers */ + skb_pool hbpool; /* Pre-allocated huge buffers */ + skb_pool iovpool; /* iovector buffers */ + volatile int efbie; /* Empty free buf. queue int. enabled */ + volatile u32 tst_addr; /* SRAM address of the TST in use */ + volatile int tst_free_entries; + vc_map vcmap[NS_MAX_RCTSIZE]; + vc_map *tste2vc[NS_TST_NUM_ENTRIES]; + vc_map *scd2vc[NS_FRSCD_NUM]; + buf_nr sbnr; + buf_nr lbnr; + buf_nr hbnr; + buf_nr iovnr; + int sbfqc; + int lbfqc; + struct sk_buff *sm_handle; + u32 sm_addr; + struct sk_buff *lg_handle; + u32 lg_addr; + struct sk_buff *rcbuf; /* Current raw cell buffer */ + struct ns_rcqe *rawcell; + u32 rawch; /* Raw cell queue head */ + unsigned intcnt; /* Interrupt counter */ + spinlock_t int_lock; /* Interrupt lock */ + spinlock_t res_lock; /* Card resource lock */ } ns_dev; - /* NOTE: Each tste2vc entry relates a given TST entry to the corresponding - CBR vc. If the entry is not allocated, it must be NULL. - - There are two TSTs so the driver can modify them on the fly - without stopping the transmission. - - scd2vc allows us to find out unused fixed rate SCDs, because - they must have a NULL pointer here. */ + CBR vc. If the entry is not allocated, it must be NULL. + + There are two TSTs so the driver can modify them on the fly + without stopping the transmission. + scd2vc allows us to find out unused fixed rate SCDs, because + they must have a NULL pointer here. */ #endif /* _LINUX_NICSTAR_H_ */ diff --git a/drivers/atm/nicstarmac.c b/drivers/atm/nicstarmac.c index 842e26c4555..f594526f8c6 100644 --- a/drivers/atm/nicstarmac.c +++ b/drivers/atm/nicstarmac.c @@ -13,15 +13,15 @@ typedef void __iomem *virt_addr_t; #define CYCLE_DELAY 5 -/* This was the original definition +/* + This was the original definition #define osp_MicroDelay(microsec) \ do { int _i = 4*microsec; while (--_i > 0) { __SLOW_DOWN_IO; }} while (0) */ #define osp_MicroDelay(microsec) {unsigned long useconds = (microsec); \ udelay((useconds));} - - -/* The following tables represent the timing diagrams found in +/* + * The following tables represent the timing diagrams found in * the Data Sheet for the Xicor X25020 EEProm. The #defines below * represent the bits in the NICStAR's General Purpose register * that must be toggled for the corresponding actions on the EEProm @@ -31,86 +31,80 @@ typedef void __iomem *virt_addr_t; /* Write Data To EEProm from SI line on rising edge of CLK */ /* Read Data From EEProm on falling edge of CLK */ -#define CS_HIGH 0x0002 /* Chip select high */ -#define CS_LOW 0x0000 /* Chip select low (active low)*/ -#define CLK_HIGH 0x0004 /* Clock high */ -#define CLK_LOW 0x0000 /* Clock low */ -#define SI_HIGH 0x0001 /* Serial input data high */ -#define SI_LOW 0x0000 /* Serial input data low */ +#define CS_HIGH 0x0002 /* Chip select high */ +#define CS_LOW 0x0000 /* Chip select low (active low) */ +#define CLK_HIGH 0x0004 /* Clock high */ +#define CLK_LOW 0x0000 /* Clock low */ +#define SI_HIGH 0x0001 /* Serial input data high */ +#define SI_LOW 0x0000 /* Serial input data low */ /* Read Status Register = 0000 0101b */ #if 0 -static u_int32_t rdsrtab[] = -{ - CS_HIGH | CLK_HIGH, - CS_LOW | CLK_LOW, - CLK_HIGH, /* 0 */ - CLK_LOW, - CLK_HIGH, /* 0 */ - CLK_LOW, - CLK_HIGH, /* 0 */ - CLK_LOW, - CLK_HIGH, /* 0 */ - CLK_LOW, - CLK_HIGH, /* 0 */ - CLK_LOW | SI_HIGH, - CLK_HIGH | SI_HIGH, /* 1 */ - CLK_LOW | SI_LOW, - CLK_HIGH, /* 0 */ - CLK_LOW | SI_HIGH, - CLK_HIGH | SI_HIGH /* 1 */ +static u_int32_t rdsrtab[] = { + CS_HIGH | CLK_HIGH, + CS_LOW | CLK_LOW, + CLK_HIGH, /* 0 */ + CLK_LOW, + CLK_HIGH, /* 0 */ + CLK_LOW, + CLK_HIGH, /* 0 */ + CLK_LOW, + CLK_HIGH, /* 0 */ + CLK_LOW, + CLK_HIGH, /* 0 */ + CLK_LOW | SI_HIGH, + CLK_HIGH | SI_HIGH, /* 1 */ + CLK_LOW | SI_LOW, + CLK_HIGH, /* 0 */ + CLK_LOW | SI_HIGH, + CLK_HIGH | SI_HIGH /* 1 */ }; -#endif /* 0 */ - +#endif /* 0 */ /* Read from EEPROM = 0000 0011b */ -static u_int32_t readtab[] = -{ - /* - CS_HIGH | CLK_HIGH, - */ - CS_LOW | CLK_LOW, - CLK_HIGH, /* 0 */ - CLK_LOW, - CLK_HIGH, /* 0 */ - CLK_LOW, - CLK_HIGH, /* 0 */ - CLK_LOW, - CLK_HIGH, /* 0 */ - CLK_LOW, - CLK_HIGH, /* 0 */ - CLK_LOW, - CLK_HIGH, /* 0 */ - CLK_LOW | SI_HIGH, - CLK_HIGH | SI_HIGH, /* 1 */ - CLK_LOW | SI_HIGH, - CLK_HIGH | SI_HIGH /* 1 */ +static u_int32_t readtab[] = { + /* + CS_HIGH | CLK_HIGH, + */ + CS_LOW | CLK_LOW, + CLK_HIGH, /* 0 */ + CLK_LOW, + CLK_HIGH, /* 0 */ + CLK_LOW, + CLK_HIGH, /* 0 */ + CLK_LOW, + CLK_HIGH, /* 0 */ + CLK_LOW, + CLK_HIGH, /* 0 */ + CLK_LOW, + CLK_HIGH, /* 0 */ + CLK_LOW | SI_HIGH, + CLK_HIGH | SI_HIGH, /* 1 */ + CLK_LOW | SI_HIGH, + CLK_HIGH | SI_HIGH /* 1 */ }; - /* Clock to read from/write to the eeprom */ -static u_int32_t clocktab[] = -{ - CLK_LOW, - CLK_HIGH, - CLK_LOW, - CLK_HIGH, - CLK_LOW, - CLK_HIGH, - CLK_LOW, - CLK_HIGH, - CLK_LOW, - CLK_HIGH, - CLK_LOW, - CLK_HIGH, - CLK_LOW, - CLK_HIGH, - CLK_LOW, - CLK_HIGH, - CLK_LOW +static u_int32_t clocktab[] = { + CLK_LOW, + CLK_HIGH, + CLK_LOW, + CLK_HIGH, + CLK_LOW, + CLK_HIGH, + CLK_LOW, + CLK_HIGH, + CLK_LOW, + CLK_HIGH, + CLK_LOW, + CLK_HIGH, + CLK_LOW, + CLK_HIGH, + CLK_LOW, + CLK_HIGH, + CLK_LOW }; - #define NICSTAR_REG_WRITE(bs, reg, val) \ while ( readl(bs + STAT) & 0x0200 ) ; \ writel((val),(base)+(reg)) @@ -124,153 +118,131 @@ static u_int32_t clocktab[] = * register. */ #if 0 -u_int32_t -nicstar_read_eprom_status( virt_addr_t base ) +u_int32_t nicstar_read_eprom_status(virt_addr_t base) { - u_int32_t val; - u_int32_t rbyte; - int32_t i, j; - - /* Send read instruction */ - val = NICSTAR_REG_READ( base, NICSTAR_REG_GENERAL_PURPOSE ) & 0xFFFFFFF0; - - for (i=0; i<ARRAY_SIZE(rdsrtab); i++) - { - NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE, - (val | rdsrtab[i]) ); - osp_MicroDelay( CYCLE_DELAY ); - } - - /* Done sending instruction - now pull data off of bit 16, MSB first */ - /* Data clocked out of eeprom on falling edge of clock */ - - rbyte = 0; - for (i=7, j=0; i>=0; i--) - { - NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE, - (val | clocktab[j++]) ); - rbyte |= (((NICSTAR_REG_READ( base, NICSTAR_REG_GENERAL_PURPOSE) - & 0x00010000) >> 16) << i); - NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE, - (val | clocktab[j++]) ); - osp_MicroDelay( CYCLE_DELAY ); - } - NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE, 2 ); - osp_MicroDelay( CYCLE_DELAY ); - return rbyte; + u_int32_t val; + u_int32_t rbyte; + int32_t i, j; + + /* Send read instruction */ + val = NICSTAR_REG_READ(base, NICSTAR_REG_GENERAL_PURPOSE) & 0xFFFFFFF0; + + for (i = 0; i < ARRAY_SIZE(rdsrtab); i++) { + NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, + (val | rdsrtab[i])); + osp_MicroDelay(CYCLE_DELAY); + } + + /* Done sending instruction - now pull data off of bit 16, MSB first */ + /* Data clocked out of eeprom on falling edge of clock */ + + rbyte = 0; + for (i = 7, j = 0; i >= 0; i--) { + NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, + (val | clocktab[j++])); + rbyte |= (((NICSTAR_REG_READ(base, NICSTAR_REG_GENERAL_PURPOSE) + & 0x00010000) >> 16) << i); + NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, + (val | clocktab[j++])); + osp_MicroDelay(CYCLE_DELAY); + } + NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, 2); + osp_MicroDelay(CYCLE_DELAY); + return rbyte; } -#endif /* 0 */ - +#endif /* 0 */ /* * This routine will clock the Read_data function into the X2520 * eeprom, followed by the address to read from, through the NicSTaR's General * Purpose register. */ - -static u_int8_t -read_eprom_byte(virt_addr_t base, u_int8_t offset) + +static u_int8_t read_eprom_byte(virt_addr_t base, u_int8_t offset) { - u_int32_t val = 0; - int i,j=0; - u_int8_t tempread = 0; - - val = NICSTAR_REG_READ( base, NICSTAR_REG_GENERAL_PURPOSE ) & 0xFFFFFFF0; - - /* Send READ instruction */ - for (i=0; i<ARRAY_SIZE(readtab); i++) - { - NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE, - (val | readtab[i]) ); - osp_MicroDelay( CYCLE_DELAY ); - } - - /* Next, we need to send the byte address to read from */ - for (i=7; i>=0; i--) - { - NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE, - (val | clocktab[j++] | ((offset >> i) & 1) ) ); - osp_MicroDelay(CYCLE_DELAY); - NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE, - (val | clocktab[j++] | ((offset >> i) & 1) ) ); - osp_MicroDelay( CYCLE_DELAY ); - } - - j = 0; - - /* Now, we can read data from the eeprom by clocking it in */ - for (i=7; i>=0; i--) - { - NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE, - (val | clocktab[j++]) ); - osp_MicroDelay( CYCLE_DELAY ); - tempread |= (((NICSTAR_REG_READ( base, NICSTAR_REG_GENERAL_PURPOSE ) - & 0x00010000) >> 16) << i); - NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE, - (val | clocktab[j++]) ); - osp_MicroDelay( CYCLE_DELAY ); - } - - NICSTAR_REG_WRITE( base, NICSTAR_REG_GENERAL_PURPOSE, 2 ); - osp_MicroDelay( CYCLE_DELAY ); - return tempread; + u_int32_t val = 0; + int i, j = 0; + u_int8_t tempread = 0; + + val = NICSTAR_REG_READ(base, NICSTAR_REG_GENERAL_PURPOSE) & 0xFFFFFFF0; + + /* Send READ instruction */ + for (i = 0; i < ARRAY_SIZE(readtab); i++) { + NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, + (val | readtab[i])); + osp_MicroDelay(CYCLE_DELAY); + } + + /* Next, we need to send the byte address to read from */ + for (i = 7; i >= 0; i--) { + NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, + (val | clocktab[j++] | ((offset >> i) & 1))); + osp_MicroDelay(CYCLE_DELAY); + NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, + (val | clocktab[j++] | ((offset >> i) & 1))); + osp_MicroDelay(CYCLE_DELAY); + } + + j = 0; + + /* Now, we can read data from the eeprom by clocking it in */ + for (i = 7; i >= 0; i--) { + NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, + (val | clocktab[j++])); + osp_MicroDelay(CYCLE_DELAY); + tempread |= + (((NICSTAR_REG_READ(base, NICSTAR_REG_GENERAL_PURPOSE) + & 0x00010000) >> 16) << i); + NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, + (val | clocktab[j++])); + osp_MicroDelay(CYCLE_DELAY); + } + + NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, 2); + osp_MicroDelay(CYCLE_DELAY); + return tempread; } - -static void -nicstar_init_eprom( virt_addr_t base ) +static void nicstar_init_eprom(virt_addr_t base) { - u_int32_t val; + u_int32_t val; - /* - * turn chip select off - */ - val = NICSTAR_REG_READ(base, NICSTAR_REG_GENERAL_PURPOSE) & 0xFFFFFFF0; + /* + * turn chip select off + */ + val = NICSTAR_REG_READ(base, NICSTAR_REG_GENERAL_PURPOSE) & 0xFFFFFFF0; - NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, - (val | CS_HIGH | CLK_HIGH)); - osp_MicroDelay( CYCLE_DELAY ); + NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, + (val | CS_HIGH | CLK_HIGH)); + osp_MicroDelay(CYCLE_DELAY); - NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, - (val | CS_HIGH | CLK_LOW)); - osp_MicroDelay( CYCLE_DELAY ); + NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, + (val | CS_HIGH | CLK_LOW)); + osp_MicroDelay(CYCLE_DELAY); - NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, - (val | CS_HIGH | CLK_HIGH)); - osp_MicroDelay( CYCLE_DELAY ); + NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, + (val | CS_HIGH | CLK_HIGH)); + osp_MicroDelay(CYCLE_DELAY); - NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, - (val | CS_HIGH | CLK_LOW)); - osp_MicroDelay( CYCLE_DELAY ); + NICSTAR_REG_WRITE(base, NICSTAR_REG_GENERAL_PURPOSE, + (val | CS_HIGH | CLK_LOW)); + osp_MicroDelay(CYCLE_DELAY); } - /* * This routine will be the interface to the ReadPromByte function * above. - */ + */ static void -nicstar_read_eprom( - virt_addr_t base, - u_int8_t prom_offset, - u_int8_t *buffer, - u_int32_t nbytes ) +nicstar_read_eprom(virt_addr_t base, + u_int8_t prom_offset, u_int8_t * buffer, u_int32_t nbytes) { - u_int i; - - for (i=0; i<nbytes; i++) - { - buffer[i] = read_eprom_byte( base, prom_offset ); - ++prom_offset; - osp_MicroDelay( CYCLE_DELAY ); - } -} - + u_int i; -/* -void osp_MicroDelay(int x) { - + for (i = 0; i < nbytes; i++) { + buffer[i] = read_eprom_byte(base, prom_offset); + ++prom_offset; + osp_MicroDelay(CYCLE_DELAY); + } } -*/ - diff --git a/drivers/atm/nicstarmac.copyright b/drivers/atm/nicstarmac.copyright index 2e15b39fac4..180531a83c6 100644 --- a/drivers/atm/nicstarmac.copyright +++ b/drivers/atm/nicstarmac.copyright @@ -13,7 +13,7 @@ * * Modified to work with the IDT7721 nicstar -- AAL5 (tested) only. * - * R. D. Rechenmacher <ron@fnal.gov>, Aug. 6, 1997 $Revision: 1.1 $ $Date: 1999/08/20 11:00:11 $ + * R. D. Rechenmacher <ron@fnal.gov>, Aug. 6, 1997 * * Linux driver for the IDT77201 NICStAR PCI ATM controller. * PHY component is expected to be 155 Mbps S/UNI-Lite or IDT 77155; diff --git a/drivers/atm/pca200e.data b/drivers/atm/pca200e.data deleted file mode 100644 index e78e83becd9..00000000000 --- a/drivers/atm/pca200e.data +++ /dev/null @@ -1,850 +0,0 @@ -:150000001F8B0808AB5A10380203706361323030652E62696E4D -:150015007D00E43A0D7014D7796FA5BDE84EC86211A7333020EE -:15002A00AD89C00A23EA83AA589C7E7C38D8152EB887477677D3 -:15003F0095C39C3DB2AB388CA324C4A509352BFBB085BBD0C73F -:150054007210B903C92991CCD1B1C242255BCCD81EA5C34C6826 -:1500690006271AC6D36A3A31B976D4A9A683DB4B07BB38265C56 -:15007E00BFEFBDB7777BA7030B2733994C35737AFBBEF7BDEFE7 -:15009300EF7DDFF7BEF7769FFEEAD79F221221E1ED844C3E4677 -:1500A8007EA3BFF036F827CF8597C3AF0C7E920B16595BCE5AA8 -:1500BD00296B6483D83E9F7DBE8FF50BE74A0B45FB1F274FAA79 -:1500D200D82E2867139DF637FD937EF1D55FB0769FE8678BDAFB -:1500E7007D9BD8885451515172FE27E4138E9FC9949CBFF026BC -:1500FC00741DF83ECE59823FF23BF89346493F6B4F17C1B3A7CE -:15011100B3B79C97D3275B5ABFEC3CF9579457703B3CBFEFD600 -:15012600FC38236CA91B5E347EDBFA67F7ED4397956EA4D3C5F4 -:15013B007CE6A567799EFFF5CFC4FF7BDF938BF83E83EDE59F02 -:15015000FEAC24BF8A3C3F2FF9FDFF933CF51EF2FFEC2FEBFA11 -:150165002341C38CBC5F4EAA265F5EAF04BC51F0059FD1419ED8 -:15017A00063493D465A2384E66A0171C30231F40AB5CB5646FC8 -:15018F005CBFB633DECCC614D2DAF622F15D3189EFEA3EE28B83 -:1501A4007D99F8DABE4D7C2418A438AF3129015D7507F1032EBA -:1501B900E174827F46C82229AE2BC63A9D50E9253960EC005FCA -:1501CE00F2EDFE0AF12A9D5EBD6A35F1B5AC441A49BAD94F22C6 -:1501E300DECB544F180D1A51FACD8C4A7C034B93DAFD6455A8F9 -:1501F8009AAC5AB74C9542EF11E23DB0946A0F1B0DA10BF0CC0C -:15020D00F9A4A8097BCA1D751474A02FEC02593C75C9E870D176 -:15022200B8CF352EC3783C379E1C2893C98017C6A57B3CDD0E4D -:15023700CE32426A9CB99F03FC2E81BF46AD0D06544FD0190B08 -:15024C00C0580B8E897EFDF490DE08FD652E9CFAE911DD5F24FE -:15026100CF832469DAB1116BE0F3C437B686F8D275C437AC9220 -:150276000542BFF6CC0320B22AB7237E1F5B97A4E927A397490C -:15028B0064C43AFF0CD8ACCE8886D37F632A7F4C16005E289CAF -:1502A0003E491DDAFB083513C6B0A6B8E4929626F531E0877479 -:1502B50082E58C9E2503DDD45DC4777E3BF1051F253E09684E42 -:1502CA00C3BAC26825AC39F5225F6598EE23B366227C52ABFC3A -:1502DF00BC2754E61BD1FFEBAE6DCDFE8D49AAEA38EE89A35A1B -:1502F4009DF0DCF4254234681BBB09E98536033F2F3C5F835F24 -:15030900107E147E1AE8AA0406A36989DB63C95ADE9F9272EBA7 -:15031E00C17C6131AC4519193457028723BE118D0433D6F063E5 -:150333005C6E1C77EC2981FD118663B2FA3A455F8D11A2D66BC0 -:15034800AFE9B096E6D4A38454D70D004ECA8235541117C7A5F2 -:15035D002D26F8E4B07D3848BA956402FC7BF8EC956CB6B6D35F -:1503720091EB21B280C218CAB04122B5957583D126189B7D88FF -:15038700FB2BDA46560F52056C867C6CE85FF1135F19E0C948D1 -:15039C0023873342916798F3A6E45FA58C9021887DB9A8DF9307 -:1503B1002EECF7421F693AB054DE6F73F4FDF414E83A6B66B2C0 -:1503C6000B11C3BA0E45D0D1074E3318C92C24FE074FF267E847 -:1503DB00E03AE67193D635C40D9FD66A65B471CABA5AC66D9C17 -:1503F00081B68DE4F5200AEA316B3E3EF5F8D4CAF0C902BFBC6E -:1504050003FD12ED00BE39F8E7C4E765F2A6F8BCC8083DA6B648 -:15041A00335DAAA0AFC4DEA66A6CDC8418EA26910FAD6A0821BE -:15042F0012B4A9C269D1DDAC9DB05A98BD06B91D807702D6021B -:15044400F02CA479BF88CD3D82BE3F92D49137C262E0EB5969BB -:15045900D6AC8DA4F4A3A0EB808FEB8570E6F34897F9F77CE4C2 -:15046E0071E4E07C73F2C0FC256AC3208B2D5C834D43BA3F060F -:15048300F39566B386103FC611E321E23D02F1168A79426C3DFD -:15049800E159DA32AAA34C083FBA62DC2474847A94BF031D86A2 -:1504AD00ACE5EAEB969CDC4FF3F3216F03DE5414FD8ED3DA3050 -:1504C2005F5AC953795A804F2146D05612811C0DB6A0BC0E67DE -:1504D7007C6E471FC3A5CFA04B06639EFA201E11FA182E7D3E53 -:1504EC009556913E89227D129F511FDBA5CF05970CF63CF54199 -:15050100BCE097B83EB64B9F4FA555A4CF60913E839F511F752A -:1505160026AF4FCB4C5E0684CF471FC48B75737DF079C37C69B3 -:15052B0015E973BC489FE32E7DC231AFD997FEF15925301975DC -:150540007CBC5E33F5D918F2E53E82FD69D1B745FF82E8237F22 -:15055500EC4FB07ED2A4626FD8C3F7363321FA29D11F14FD6938 -:15056A00D13F2EFA9D40678FFA1ACBD131181B507F88FBA8451E -:15057F00E179507D8362EC4FC2734A7D8786D5D526CF431356CC -:1505940010E6D51152BB2CE6690F243DED35694FBB17D6017487 -:1505A900B251C766F514A3D3037337AB67189D043C77A9E728AB -:1505BE00CE3FCFE5A0C8B347ED17F9CDB09A812EE4A09AFBC861 -:1505D30005F3ECCE1F76B0B8059C6AD51342D87777BEC16093F7 -:1505E8002ED82B3BDF613094C9813DB7F3A50E87FE6A95AF1F58 -:1505FD00D259C69E53B447F047991EAA1FDDE8D0747091968332 -:15061200EBC88AB2D5095CA4FB07AA87ED030961D37494DB348F -:15062700C27225D77D497EBF32958271CE6F8DA0D12CF612E37F -:15063C00718ED32568206F3FDF874C7B477EAC4DD8310AE35B40 -:15065100C17E683B139EA3EA6178A6D65B4CA65926E72EF555F4 -:150666007A82D977D06A9A610E58F3D80D4F6BFDF4DDFAC37506 -:15067B00E7D67D672AA93DD881720C301B55C6E4D0860EB97506 -:150690007D5DFF3A0A636BD898CDE4AD4C7A42CBDE915B037587 -:1506A50087D7593056DDC1E5477B55429CDCF8B5DCFAAB15AFBD -:1506BA00AE3B0263FFD3EE69AF8C5584FEF3FD0FDA90E6BFADE7 -:1506CF0030DB70FEBF9C186B43DC4BEFBFDE4682BD8C27C86F5A -:1506E400B3BC185CC264063DED086BF730DA2418B655D6F63110 -:1506F900394850B53126EEFCD1AC2EBD1B83F83B6D56056C5662 -:15070E0027F079B3565739DFC3A2AC8D591AB48B37FD4097B6BD -:150723007D4527CA41F38E00D6C48665887A30CEDA5E6BA09CE8 -:15073800EF7568CF8A7EC03FF80DC05F6B56078280AFB25C86D9 -:15074D00F863ACEDB32658DBC26CBEE04780FFEEB7017F9BB98C -:15076200301001FCB0C5E54E5A0DD0BEC8D6618FD53893DFDBC0 -:15077700489D0A781A5B9B27616DFAD4435409C08E179C365B01 -:15078C00B86D2C5EB34E5BCDD0CEC0B98106CBBA25A29A87AEC7 -:1507A100676BD0977601BC4A7DCDC2BA15ED575E1DD7B78610CF -:1507B6008FC715EE954F0A5CB4B78837139F9F079E8AEFA21E32 -:1507CB00DF9814679714AB9163E99F59FEBDE3263A704FFA4DF8 -:1507E0000BFAD400D9FCE1115DF1C541C7772D591DB7BA1C7929 -:1507F500D4BBCC1B9F701EC761BE22E4A1429EB736E6E5C1BDA9 -:15080A00EE92C09D74C933790B79222E79BA401EE8535A429E39 -:15081F00F3ABF2F23C2B785CC43812F24C0A799A5CF2E05E759D -:15083400BFC0457F73E4C1E79BC91376C9B319E4813E4D9690D5 -:15084900A7D925CFE55F711E6D33B8A771799007CA73BC252F86 -:15085E000FEE3567392EE35506B935DE3E625D87B3AC9363DDC5 -:15087300675D387B325FEEC53DCA370CF1D064D2707F1F9E1BAD -:15088800BCCC7732962CFCB60AF76B17AFD80C1694A4D6EBDAB7 -:15089D0047E58DFC1CEB75E1E10563311E21B6794C95704FA00C -:1508B20031EEBF8BC93DD0270326EC0F8A54674771FCCEF0B040 -:1508C7007E67F81CD864D8EA401CC819480FE1811DBC76E5FDFE -:1508DC00733A83FDD508D6AA24406D9DCF3FA75FCC66FD65D592 -:1508F100FDFAEE7BF332F5F0FDC225936D769033AD01550A3A24 -:15090600BCF12CBF86F184F305E007567C68E59EDB3FCCF1498D -:15091B00D79F692B73E8803CC25E4CAEDA152370463A4A2DE42F -:15093000AB34998BC0DE1BD01C0AA7C5715314ED0FC74F4B510E -:150945005ED2BDC9319893001F18B3A2AE734B17D4E2CFA89EB1 -:15095A00D6B7245E6394E2F350520E95A6DD6079943780F65B70 -:15096F00507B1C857AE36D0B6B12491D8133EA88E6D41A72B92A -:15098400A835607E52D421448C255D7548EE0F723FD656E84744 -:15099900CA3D28974DE33C4751AF90CFEB9603D61BE545BA8197 -:1509AE00906D2A44D446CA190BE550DE5F85B273DF637264CCC1 -:1509C300C15E487501388B928C8974B4ED9C4E8FD80F395D9B32 -:1509D800D9A7F6FDFD5482B3B6141B358F92514D3A30CEEA2EE8 -:1509ED003EC7B6108744E478BE6ECB98555F46FA54D0E77A23D8 -:150A0200FDE876AE1FE7932AE0C3EC226CC2EC98E676BC7347DE -:150A1700DC0A446C361675F3A48267306C72595A4C85D9A5D310 -:150A2C006467AB60D0E4761AA00C1E19A6CFDE057584F27DAC4C -:150A4100810A64F09F5845DD6B073896ACC05936324E1D3FC1D0 -:150A56001C843796C7485C2391FD168998CC2EAC0E807119F419 -:150A6B00A52D86899716E555719D1E5CABF77860FDA686D87D2E -:150A8000881FD74839ABCBEADB34C06AE6FC196F49F9DC3367A7 -:150A9500FF9653FCBCE83E774E9DC198FD9433E7203F734E0EF2 -:150AAA00E7CE9BECEC19F9BEE5F8961C30A2634DFCFEA0D0B70D -:150ABF00B82FA14CBDC23E6C6D4249E6574419B2081DA247F1E2 -:150AD400AE02FC0A7D81D9CC00FA74C84ADCC82E72F9336B3524 -:150AE90075186487D8A757CCC5B06FE37D56B5BAAAF912D674D6 -:150AFE0012F13EA3AE0D5D83985C9FF6B7B3DAEE31CEB713DA06 -:150B130045E420F33B90DB12700BE117C47D4058E0468A700568 -:150B2800DC42F87111EF0EFD1E316777D11C01B710DE2BE8F75C -:150B3D000A5CA30857C02D84B709FA2B05FD06818B78F8BCDCC9 -:150B5200956F1A5D63F88C67293C4379C18FCAAB46C037862CF0 -:150B6700B497ACBCA2E37A07D5613B00F6AA091FED901553AFF3 -:150B7C00EDBFA257A9A7AC65C6076D814DFFADCBB131EB44D2FC -:150B9100D3ED8D9966269B5D0C355EAB1CBB62393E5B09B92DA1 -:150BA6007D3DEB73C7C0B7A0CE95599D4AE7C4A388AF5C5E4121 -:150BBB001ACAA1213D513EACA16C353B1A2C279ED9DA634E30EB -:150BD0002027A4DFC63C22E273C22A8E67F405C61362C61D27AE -:150BE5002FDE11D7C365DC0F1591D33E2D4E5E82FD3B17230768 -:150BFA008634CC078AD84F31565642CAC2B3E0D3AC9E17310500 -:150C0F00F1F318F89BA8DF73B0FBC5B9E2E6B1D4226269A8F448 -:150C2400FD8D2B9E7ABEF0DBCFD57473E2296C3D2DEC7EBCF2E1 -:150C3900AE00DF13950DDEA802CFB7FA713CC25A35E0ECA52AC3 -:150C4E00D412F544A96ED2E3655F78CA23E0B4C678CA19C73BC6 -:150C63007A25DCF084ECD008279EA8719E37E5E1B9FD8ADDB182 -:150C78000DC0764CD423AADC4D73B519BFDF7C84EDF7B3589BA5 -:150C8D002978178F2324729206D4F666ACDF181C6C7FFDBEF62F -:150CA2003F04FFB4091D3E8BEDE2C8A08EF7A1481361354A427E -:150CB700BF0075C79CFD52F0EFBA09FFF58CFF80C9F2281DB6EB -:150CCC00918E943ECEE946809780E173BA047D6A637DC3E9E326 -:150CE100FD30D41426ABD5A0BF066353F5B7AD57AB426111E732 -:150CF6002175793BD0A435CA01DD9101E36E51513FF72CF85916 -:150D0B00533FD0D6AB0F846AD4079A03EAAAD056276FA94F71C2 -:150D2000DA82A6E43B3E87AEF48FB786AD4E2F6F75EEA36584E2 -:150D3500837D8F64208743DE10F7CD8B56A7E5565C0F7627CD82 -:150D4A0071E811C84132E2404C200ECA9A85BA8E1AFB35425244 -:150D5F00980BCDECDF9F97C1AF71CF55D02E2C2EA660BF823D2D -:150D74006135190E61FC6476BEDEE1BEA7FD9C787F107F84E908 -:150D89005860EF2C9930495D2A9AA76D08DAB6C1624F81FD644F -:150D9E0072445B638C94A45D2168373E42BCEE7D285F5F65CC2D -:150DB300E4D7B03E3172F5C9FCF381CDF301E856321F28AE3A51 -:150DC80028771E688C4A5BD641CD07B107B58A72379C210E6DFD -:150DDD00D477415EF648712D0AAD1C4846132A3F977C1772DDE5 -:150DF200B1E4C7CDE4EA10BDF6B5FC7B8D3D5FFFDDFEA623C476 -:150E070037F149D60767196DF37D72BB73D787F76764B77176CD -:150E1C0012DFEDED4E9E9D62ED24C612B4E9B319F6CE0FCEC553 -:150E310060A795E28EC5592B49ACD55EA03DFBA77C1F408D2F19 -:150E4600C19925111ED61AB1FD22D431CC768DCC76686BC46913 -:150E5B00025948755C5BFE89B05F4C62F603E3079A805E15C03F -:150E70007F7E9F7C2F5BCFEDA2BE82166B17AC59900EF6BB59E8 -:150E85003D95F781473ED50706C49DFE70491F5072FB7DC6422E -:150E9A009DC136B6B08D2D6C630BDBD8689B72C8E56E9F99AF8B -:150EAF003DF1DD13D451C14A757F10CEF8BE3C6C2DC00E06535C -:150EC40005B03F02D8D1E09803AB42582DC056042711C6EE3D4A -:150ED900B87DDFFB18EC09763DFFF15CBBBEF730F18D7D8C764C -:150EEE006DB877BE7ACD579F7809FF2813FE1105BE17B615CA1F -:150F0300D922135F23C8E20159979490B511E67899AC4DF7DEFF -:150F1800CE1ACC57DEDE12F2960B795F0759976C9BEBCF06FAC8 -:150F2D004B095F8E5DCBFACA408FC8B5B97AC4804EF81AEAE194 -:150F4200BFF7767DE976F4E929A18F2CF4F9F956E2EB84DF675D -:150F5700E1BFF97F4127B5812A6A1365EFE620074AB029B701EC -:150F6C001CFB32E934357C0E6AA60AD659AEEA96A26EFA5B76F9 -:150F8100970E79676B6C88BD2B8E7D53DCF73CC76A5433FD0D60 -:150F9600A89D643847E33B55DC9401EF62EC9455F5C419EBC295 -:150FAB00479C3601BAD9858639057D89F7BD631F15CA33267057 -:150FC000DF83B68B244DBFCAF9118DF3433EC8CFDE5DC86F3932 -:150FD500E0553D71CADA0AFC3441837EC4F9C5043FE87BDDF609 -:150FEA0054843DCD3FE1EFB8AF3E440AC61789F15D62FCBDA29D -:150FFF00F11A31BE558C8F158D2F16E34D623CC1C63366D79E29 -:15101400FC793F0B3A5202FB37ECD5DEE52452707687BF81A5FC -:15102900B646E14C41EA923BF0AC5963EC5F87EFF53591D70ED8 -:15103E002C9DD53AC22F873A5DF7E92F4C3CF113B4D573BB2F35 -:1510530075045DF0CBAFFEF57584B7EEF84987FBFE7DFA8D6F83 -:151068009D40F893FFF0E30EC2BE871834E3FFFC179BFC0163E8 -:15107D0047B297F8269F24BE3972BAEE17827F59B87FCB380E23 -:15109200F9167388548D39197231C24AECC74EAE81B351FBEE40 -:1510A7002DE2DE07700F6C19D52A638F065F811671F66EE7672C -:1510BC003C1C73CE320C5644AF8EDFF7F1EF332E0FE8F683F8F2 -:1510D1001D01FB1640C47E8ADD2918BE51B6571056CB2419BE69 -:1510E6005F39CDEE52768B7B1784A9EA283B4BED71C18202D67F -:1510FB00E7823509D8DE99FCB707866B1CED4B26086954472D8C -:15111000370CBF436C2882554932692E84518A67BFD838550E10 -:151125008DEA2D3826F4C6EF6508BD9BD99D8AF91FDC58F453B2 -:15113A002F9B9FF345D18A7E649C4A07F09C0338ECFD3DE713EE -:15114F005647E93EA827B19EC2F3EE65F0B7441FE9C6F74ED3D0 -:15116400397FE1B66DACE2760DA74FE6E40CA74FD3FE2DE3DA2C -:151179006675DC72D37C79E98086FB33D28C15ECEFA3ECEE6226 -:15118E00AB80ED1132EE113206605F6732E27B2576864DE1DED8 -:1511A300CF6A05B6F78BB51C106B298B6F2998CDA06605DE16C5 -:1511B8007EFF9280338317CFA17866127A7845AB14B5176F64D1 -:1511CD000BEA546EDF93EC5E0EF76903F4C3332E3E3B30F2F086 -:1511E2005C58991BC6EAE794D509272B493C6F56381C6C66A124 -:1511F700DD6A33CCCE0143C8C160013B1AD89812E727389FC223 -:15120C009C5A03D60DD688B591717321D2A3A356297C52029F42 -:15122100E4F0DFE4F605183C5B7B9DCFF944FCBD20F4E4B19C55 -:1512360062758BE4E804CF57A514F3F7A03F3FFEF296FCB8034D -:15124B007BA9044C7E782ECCE386B9623AE7DF22A69C7875C78E -:15126000727F512C633B25C66E36C72831C7196BC4F68BF9B97C -:151275009590BB8DBBC902278FA04D5E747C0E9EEBA7E37AAC39 -:15128A00687CC1E594CE69A4CC1648B68998A71B7CAC06F7016D -:15129F0073733E27A17F605C38637DEE31F6ED1BA7C35A178D76 -:1512B400CE221A8E0DB80F7298510C037A2F38307F1E66948027 -:1512C900555617C250A7FD2E9D1D58BC04ACBCDA0D334CBB4EC1 -:1512DE0026E1D5C23EB08F60CEC0B8F483CF634D85DFE4B17ECD -:1512F3002015AD75BD4B225584BD3342FFF533FF1D311D3FAFDB -:151308003C84DF1BD87400BFB50BF35C568A8672DB34600CF7B2 -:15131D00176514F12C2D1717498AF91CF3E12ECC25D0C77907C1 -:1513320097A634461F7DC54F6829B8E2829B6EFC25A5E10AC018 -:151347007B9DEFDEEA788E75DB6BAB74137BF94BEBBAE0B20DCC -:15135C0067E4D1BE83504BB03C301FBBFD1669A19EB75A03F3CC -:1513710076E4FACCB40AD7D51679DED9AB793E2EB475613E2E11 -:15138600210BCCE1B2A44CD602ED85480F6ABE927628814F729C -:15139B00F885F2ED75F91DC6AF543D37BE49F5DCF82EAB9E1BB7 -:1513B000CBA404EC15DFDCF8F654CF8D65B90886F847DC73F32E -:1513C500EF3C2B79FD8531CEF706B469BD6BEF83D6D825BEDF9F -:1513DA0020AEBD50291A935D63FEA231AF6B6C49D158956B6C58 -:1513EF00B922F611E52D4A1493CAEA307BCFC4BF63A4F41A6BD3 -:1514040007E9F532BEE765581B34A1A82072F5889E30C635FCEE -:151419005676B13CA21F2B1FD78E854735AC55BE639CD3BC1730 -:15142E003FD0192E201F360E68CA5653AF81BC5CE97AFF8BDFE1 -:151443008FCAE638833F17AB0ACDB8D613DFFBFFD37DFC7B9AE7 -:1514580058EEDB1B80CFF0335F65F2D7CDCB92DFC4EF4EC4B7BF -:15146D003313ECBB277E5F3EC1BF8D080E50FEBD0C1538830C25 -:15148200A7D7F57E03DF9F3F2BF84CCEE17347011FFE7DCD0460 -:15149700FB7ECAE1630B3E5D820FC719345551A725A13D119479 -:1514AC00BA2B0E8DE8FEF02AFD353C9FC4EE6E0BC42A425745A7 -:1514C1007C5D8ADD139A85672FD8BF5E8BEBD433DA5719F3B4AB -:1514D600E33A292ABE8B033BBE097935297577A9A72C388AD66C -:1514EB00C8CA5A88EB03B42E7CB0ED30665CA5DFC46F5D37FF53 -:151500003B9CEB22BFB41AD45F5ACEFBE836F58015560F5BFEA9 -:15151500F408FDBFF6BE3E3A8AEBCAF355AB5A6A498DA816ADA6 -:15152A0046C2209588708447715A422648964C43182F78306934 -:15153F00639CAD12C26EDB644C1C26A3DD61E7704E58BB255AC4 -:1515540020E10729D548462638B4B064E30938322B123C47248E -:1515690062E275F02C61B48CC390C4269D19C626332456BC4A65 -:15157E0086CD38F4DEDFABAAEE9210FE9839B367FF58D5D1A9A8 -:15159300EA57EFE3BE7BEFBBEFDEF7EEBB657887B6D5087BF17D -:1515A800081FA63A83A941B22B5F3491CE945E0EDF6E779BEBA1 -:1515BD00BF3ED0EC2E5FA1FD996EDA75A02C9E5157FCDBF00DF9 -:1515D200AF6E8D4C2B5F4CE523EA336693FA8A5DBE77C6F2D17B -:1515E700E31818D5AD80254CEF6AD47623AC7673ACFB9A2CD1D0 -:1515FC00A6A93F37BD12FC228E7293F5B5C9B184594CF2CC8307 -:151611007DE9E8A0E98BF59AFED8A869EDDBB8F9F8A4CDC7F152 -:15162600297C9CE1DFB1214D71F16F51CCDB98E151EC1B61AFE5 -:15163B008478348FE466095BA45B7DABB6FA16196876F3735093 -:15165000ED364231F94E6BBFC1E0F0E51DF97BAC8FC45BA1DF9D -:15166500AF6E60F987CA929AA22E16B459053AC0F5491D31629D -:15167A00EA5123A26EE04A68756B1FE9A75864EF1B7F41737C57 -:15168F00777BEDF1DB6FF95B14BBFD285AA9BF3945A7743575DF -:1516A4008C67CB1C31B9ED0FE7E415FB9AE349AD9878DC5D3E9C -:1516B900AAF61A1BA87D8DE0D0D483F47FD56853AB8CED6A8D70 -:1516CE001157EB8D2EB5C930D45544BB477493FD595B754AEC79 -:1516E3009FB6F553FEA43A6A1C51B9D1F7EC515EC28EE97336A4 -:1516F8003DCB17BC759527367D92772E58CC776DAAE5BB9F6D89 -:15170D00E05D6FADE04F2F38CEB166F2B91FC0892426ECBAFDF3 -:15172200CF9EE2FED387F59EB7F6F262B677A91B2E3205F38BA3 -:15173700D455CD99B46807AF92587EB13B4D74A083F39BA4BF13 -:15174C0071217D43BA16EB3032FB606FDDF89E191DFCFD821912 -:15176100EA235E1B79279D5F953C6C88B1053FE0CB37DAD7F014 -:151776008388129F788B3A85AE7290F2BC1FCCFA9DF8A6FB9DCA -:15178B0010AF1E14B65E3B7C7A4CE13F4D63DF4B32A32F49FA86 -:1517A0006CD3104F596B5EA6DF3A5F31A744D87D9326DEAB6A39 -:1517B500027BA94167BC63FD5E8B55124FE0EC483B8FBBDA56CD -:1517CA0066F0C3F1C5A85D3127C44DEC57F6A9528B323AC0AF33 -:1517DF00D96D627F734A9BF4DE37ADCDE9FB071B5CED3357FB1F -:1517F400EA0CEDCBAEF6E7CFD07ED5C76C1FFE3589863077601A -:15180900010C3BE65830CCA7B6A6B7AF8CBE28DA526303A46BCC -:15181E000CB732A5D384EF8F4CB67188DA9D1F1B309E5EF06B13 -:15183300E1D331E9F6F371EDCFAC7D2AEB3F22E52774A9ECA464 -:15184800BE7EACB3D1B78E0B5D46B92FA995EC18E1511F8B60C6 -:15185D007C96EC18E4317A866F01F21B296F0B337E6D62EF18A4 -:15187200699E6969D4D712C77F24188AB5865929DFD939B88DCC -:15188700190F70F08FFA790234A4B5FACEEDA1F64EF292D096AF -:15189C00D6B93B8EF208B5118C5B3A33F2083F10E3707FF1B807 -:1518B10021F67738C13277473D27B9DDD6B177ADF0F3098696FE -:1518C600B576DCFB29FD3CE1E9B598E74ECFA5FF20CE4084AD8B -:1518DB00730562BF0D739DBD9F2CF6434331A9B94059AFA36E52 -:1518F00094654A3397A5C37AA7381BF0B258170EC2C732BA3C2A -:15190500B35621C717E9589F484C785A426F35F0D08A7B74362A -:15191A003E6286562CB6FD5AC4BA96B557611C3597624F3D3A72 -:15192F0018BF4DDDB4043693D88735068633FFCA603C4875F9B3 -:15194400F32BF52BE974E08DE57AD3E34F7A9A1C5A5DA0BEB02D -:15195900F0761BEEB69BC2EDB954A1CBA79337C21E5E6686ED09 -:15196E00F593E9F04346032FE883D59719FA30FE0D731DFA6039 -:151983003C175F29FA10113028D1B80EF80D35A70577C08F3B83 -:15199800F15EC92CCC25E37BF8E0EFD285428F540EC7C7976FC2 -:1519AD00AA1FA5BEADA2BE39EF77FCCE75D410FE24048BAFE8E2 -:1519C200A8E085B93B4EF00999C598B16838A00CEA993335F4F6 -:1519D7005B8D25E8FD31FE3EDEC37710FB414A3B6C06E386DFF9 -:1519EC006E7FA97D597EF71525048FB3FA041F233316FB9D6202 -:151A0100BF69D883FD6A137BBB57D3E950D6FF89C6CBBFB17C5F -:151A1600625F767D5894CF961DB6FF8DCCFFB4F5E2B6988F27FD -:151A2B0053DF3715E2733535305C1CDA4EF56CE1C154A5312B41 -:151A400095D3B22AB5D80884DA88DE63A2CE10CDC92CFAFBFC5E -:151A55003519FBF21A87AF8EFCFA2384C752BE16FABD021FF809 -:151A6A00A8F0B5EA8DD7697F1EA96DBE47F5349FF75EE1A1C844 -:151A7F002797826E1BD2E9C249C9B193BA8D3CD02D2AEF32DA11 -:151A9400E013B89683D6C85743F9CEDAF9C2A91554EF6A739572 -:151AA900C573C38286F6BD26760FEF16FB8295246F5682A68619 -:151ABE0045C3A9F70E09EB8657787A391C7107881F3FAD4DE607 -:151AD30058F517F101FD41755663B13AABF6A5CA924673E18293 -:151AE800C657F18EE018BC9E2E5CA84A8D024E85F4B072A3D58F -:151AFD00C7FAF9E51FA7F333E7F1C60F5B7B8DE387CD4365D585 -:151B12001AF58C63BFABD7AE9FCA37A32E8DEA72F23AF9B6524A -:151B27009E7D6B06B45D34C6D0875B49E64D6F6BFB8FAD3D8A0C -:151B3C00522AFFAA64C185737B5D180BE37163BE7F500FFE6E98 -:151B5100BF8101BE3AF5A2619DD34A3333F282D647F5CEF3D710 -:151B6600E8A42B97C0D7BC865DE189C837DB70F62E89B1BB66B3 -:151B7B00B16E12AD72D990EE25FEC7DE506364A89129CF59B491 -:151B9000B1F5378C6159F0994A70455A05FCCA73E69B3F4AE70C -:151BA5001FF558FD5C49B46E9A81A6B751DBD3FB34F8A3B4D82E -:151BBA0013443D5BEDF2F36252A3779C6440740FF7F8137A2424 -:151BCF00B59F375D4AE73B6573699CE02CDDA88D779CE714B2F2 -:151BE40080F0E0E4E9A777E2D9788AC77F98B6CE3F529E37DF4D -:151BF9009F8A7BF0E04CB012FE4B4A53ED46FD050BE783D3CA28 -:151C0E008D02FFE07371566D0F77708D3371AB530326C73E7BDE -:151C2300785ABF5957A6DF472F5AFD06ED515F1BD55763D34CAD -:151C3800F0E6A0C59BF04B97D6FCBE1EA5F7B73AFC67D3C2C2FA -:151C4D0063B60EEDA2056B1BF1C4C8BF583C31CF5FAF8706A432 -:151C6200468737B662BC5BE73B6DDE209D3F32A42D64279AC1E8 -:151C770017C18661C10F667CA1E6EB7E519769AE5C68F381E5DB -:151C8C00F73A95EEA493FA42CA61E2F9765E447C116CAFD595EC -:151CA100376C7C3BE3C15506F6D44CF8BE1DE39DF203E737B4A5 -:151CB60043E3E928D5E9F8D3E4BA78631BF186FAA6C51B12E1DB -:151CCB0057B67963EDDF5AF8157B568493CBBFCDD20FF5CD8A7C -:151CE0006ED1B59F7CA99E649C599D5A6356A5569824E74C9214 -:151CF50083C60CFB4DE21C33F4143FD901C2276E063F6FD2937B -:151D0A00785E51B7DE06BF4CD2DFA09749F9033AF6B5BAEC73CC -:151D1F000BF02D7B50F8330D0B5B4AF877E34C34D94F87CA4E3B -:151D34006ACC1812BEDE4AB2D384BDBB2A794AE877F1E410782A -:151D4900728EA2769AABD453A641F712E388FEAA6ABD67954398 -:151D5E00FCF24DF43FD8438150B4750FE66FA58A17939CAF263F -:151D73003BE676F8E23B7633D96915DA55BD27B2BF0DF8F35FD4 -:151D8800C8DACDADEA7DE6DB3F93EE94957BF52A7505AF225DD7 -:151D9D00FE92EA6D0ED2FD5BF04514E36C0F2F3D9FCE7FAD5214 -:151DB2006E249BDC207BD698C78EDD15211B50B6694D76AC01A8 -:151DC70059D9E44A433E25146EA53ACD2ED5DFECF8589692BDD0 -:151DDC009BC72C3D0DBF8F52DDBB95A7DAA08F55CF618580CB48 -:151DF1006D67BA6DCCE80FAD71D029F257F36BC5AC9029EF99AF -:151E0600412A0399E186C9E2BF7A7E3BCD0B800F7004D5970D68 -:151E1B00F4218F781FEBE76C7C31749E6068C5A774F41D7A90B7 -:151E3000F774834E6085AAA82E21038C1E1E559FE1AFCE26DABE -:151E45002BC46754DE6907766090F41F4A33DD6DDE934E8B36D0 -:151E5A00855EA51C364748472B8FD9B22C6AC939D4D9361BEBFD -:151E6F00F6614A3B2CE0F2B2BD7A0FE08AEE3121A71CBA396BC1 -:151E84001ED13740BBF704ED707E5C55498F573A877DEA1DA687 -:151E99007705E940D1BDA26EE8F5D0E9FDEAB366CD75A929AB9C -:151EAE00CF583470F0EDA6C360C0F2BFBCD97B1E60856E7A0042 -:151EC3009EB1BFA139D2A117E495526526D6701D7AD4E49355C5 -:151ED800774DE7D7A87D9E2F9E7AC72C095D6CCD49922D7DFE54 -:151EED000A8D8D2FF00AED4FF425B16FF37D9D27DAC43E90ED91 -:151F0200971EA6BBB087B08608C28CC1C77DD80C8BB3DCDF30DF -:151F1700E684CE50BB3F249952DAEA8B3D493AED72CC2B66C792 -:151F2C00BD0F918E7BBFD171EFBD7A774A024E857E9B87392E76 -:151F41001CB5F5DB2ECB2F8FC66CCCF6B31F16F76ADB0638627B -:151F56008CDC073B2B4265B6087D3A2D7C44525C444EC819E394 -:151F6B00E1582D9F9DCC69093CBB9E074EB7E852F2040F40BFA2 -:151F8000879E7C1F7CD25F163EB87DEC9B1ACABD4FCA53DF677C -:151F9500BF69EDA7517DFBD97734B6ED1847F4903EF66D0DBA40 -:151FAA0018E4771F7B4D832F2DE089920E87FC80E55689059E76 -:151FBF00227915185BA9DF4DFDF12B8FE8B2FA9C81BE3A7E50F6 -:151FD4002C7A9FD931EB5EE1039C4F3031638DD9C70632FE501A -:151FE90028CFA2CF99AF125FFACE8DE86CA4D384FD04FA0FDB39 -:151FFE007BCC68ABE8524AEFCD7941E8F56BB1AE3C72CC1C63DA -:15201300225F1CFA3CFCE2B0B78867D80758AF213917C7BC7364 -:15202800ADE27073B9EA69F49D233DBCFE18A7726DED852B5BE4 -:15203D00A05F930D5A124DBD635468DFD3674BCF0B9DD8E33F85 -:15205200A1236F09FC1BEA87903F7270672FCD457DC236050FD3 -:15206700887764234E923CF49D3BA8CF3BF79CCE2607054C382D -:15207C00EF437C2564FC1FC6D6365978F986E13BFD72960F9219 -:15209100DE0C1F84C007842787F6BEC82ABDABCD63D111F4336D -:1520A600BA4D879E4FB31735879E2CFA0D73103ABACD2B53F1A0 -:1520BB0067E1EDABAFFF9186337253717644E0ACA44DF848DBB0 -:1520D000381B06CE026CFC581CBEDAD79EBC7789A80FB6CCA84C -:1520E5008533165D346CFD77F65B733B1B9E3B7A42E047AC7FA6 -:1520FA0019C7CC02E8C5935FE16F104B127F9414A53CCDC0ED45 -:15210F00E39E2796FE69CA736728E66976F30978C373E91DDDF8 -:1521240027BDA077AB599C04A78C0DCBF6035D2D7EB6C60AF085 -:1521390094E1F5E9769FBDEF6EAAEBEFF49DBBAAC367D9EAA701 -:15214E00C1710644E83FE1301778D9F669AB7FCA401C6BEB2D2E -:15216300EA034BB0FFE1659D7A70C75745FFD8E6E778EFD81756 -:15217800493E7CD174D93BFDC2D6C19E36E18245474CA78E203C -:15218D00D951852E5C8C117F2797AF6FBA7EDDC2C76FCA9FA8EE -:1521A200DD40FA96859FBFD7EBA4273F003FDF27FC3CFFEF82DF -:1521B7009F97809F7577E98E6D9E6661CE267F6EE1836CE6DE14 -:1521CC0038EC050B1F0BD8223DF8FE62818F9C68A95E1E2F6F3A -:1521E100BE45CC71FB782CF5AEB9ED97B0974B5BE9D9807CB1CE -:1521F600EC1FC21BFBE32C0F2A583310FF84BB0117EE5E369D99 -:15220B00F6A6E3AE9770B78D70F77736EE2E12EED07EC8D5FE2D -:15222000B55F586D4F6DF7056D5FFE505666DC5C56CC71C98A24 -:15223500A64C3EEBEC74667C2CC4BAEEBAE7333244D8E7E3545F -:15224A002E3EA44D2EF70AD8204B204722A4E3418E604D0A67B3 -:15225F002050EEE9944B9EE4BCA461FF0FE736F05EBCB3E449EC -:15227400896FDD4BFA016A5BC8946D4362CC627D0A7D2E76F53C -:1522890059A63EBB65CD74FFA551F8E6285C2FBA64E801D20F34 -:15229E00FA9232F547354EDE27F4CA906B8F8C063EE99034B72D -:1522B3000357276DFE4079DF42962F8FEFD495F33BB5A9FEFC1E -:1522C80086B0357697F56B42B7945917703526D65C86E20BB10B -:1522DD00A743632327752C2EA74EC47D7ED27308BF05F1A1C669 -:1522F200E2A841F301E73D29B94556137CAEF217382B182AC2CA -:1523070019BA0C4C5161776CC799BBF2D5ADD0B1587958D821CF -:15231C00D095271EB07C67AFE15EBE8CE6DDDF3F207CF7C2EA17 -:15233100F1D40333FB731B87B07ED12FD62F76931E5C34D629A3 -:15234600D609D8B89C301A8E58B04787E245F06FB4D33DB1A12D -:15235B00B8D2302CFAD7C3F66A384FE85B47F3883104BD08739A -:152370008C41735BA67FC591C146A7ACB58F9B79BE019E6B8741 -:15238500B2EB31BBCB86B5A2B80D8F711378285D215B1AB0B83F -:15239A00DB94ACFD988ECC5A8DBD3F8FBD68567ED2DAF7B4FD65 -:1523AF00110977167EACB5F4A978543A0F4CF12FA27110BF1F74 -:1523C4007D305A31164897E928B77CA2E21D94DE1B4D6ABE22CE -:1523D9004B2F4B114C5772E258F32AC4FBE87ACB96C1DAC1428D -:1523EE00DB8F6AB5E09123F1FBE89D03BB809BF26BEBC51EA3A5 -:15240300D8075C6BE7D35DF956A45EE8A0FF38D28DF558CFF983 -:15241800761CF31EFA82FD4FC0D1BB73480B8ED9F050BAD3EE10 -:15242D0016BBBE9E19DAED77B5BBD5CEF78C2BDF4A6A17F99220 -:15244200AE7C6D76BE8119E05B99FA661C67108E0818BF1BC70A -:152457001ED815824521F89E16BC734CF8CDF47E8F6065D6BA3B -:15246C00E01517ACDBECBA5F9C01D661170CDBED7C2FCF00EB9F -:152481004957BE1D76BE573E0056D0D881F5EA87C07AD5056B9E -:15249600CAAEBBFDFE1B61EDBA3F0BC3653B5FF7FD37A1E7FD24 -:1524AB00597A5EBE093D2FBBDABDE2D0738676FB5DED5E75E845 -:1524C000799376B76CC0F81A050E8C0977BBE8AFBD7E8F74875A -:1524D500E71FA7FCFBD95086E737782D9E7F5FB2783EB621DB46 -:1524EA0076D46BB5FDF0860F681BFBA576BB4E7B93AE7E6EB0F7 -:1524FF00EBF8E2CC751818B38E6FCEB5E9328FE4CBE5C1ACBCF8 -:1525140013E359ACCD22E69421FC099832624057F1F93BF5DD6E -:152529006586A6D0FCA0AC3DA597F213FA3E9A12DC32E809EAA9 -:15253E00D74CB2C729179286B4FDA437825F2CFFC7BD644B24A5 -:152553003BE0EFBD52D4959D1BEAA82E0FCD0B19B94A7A896F04 -:15256800DD9090A9429E3AF3451CF27448C853650DC14F725439 -:15257D00723D4F9D8FB0DFDBAF4965869EC61A18F6DAADB37498 -:15259200F6DC346CB56FD8F234DA678A35D5F121C3EACBA0069B -:1525A7007F17EC0B189897C85E99ABBCA2FB48E7C6DC34E37C24 -:1525BC0032945D0FC73A1CF6944270D7856FBEFD9BE6F339D379 -:1525D100D7C2AD75DCA3864CF348A0419C756301E917FA933497 -:1525E600B72D10BAC911331264D1D7688EF6150D0A9F0E2B1601 -:1525FB0058B5D807DA5DA66AAC7E2F6F13FB0B3D64EF579AE254 -:152610004CDCFFEDFFC3BD1C30B36DEFF238D159C0EE7ABF99F3 -:15262500F4B6E5F4FECBEC1F9722C609FAB0ABEC88735E5915B9 -:15263A007D237D48F44321BBE2E3FE0FF4F29215EFEAD9B4A1AD -:15264F00E175B1F412A7AD0ACDB2D53F4A5BF1E48D7535C6BE43 -:152664002BEA8A7E40F918952B5D33B5DCEDB18796587433CC8C -:15267900D5A09B5D2E4C79FDD3F2D6C52AECBC2A17FB43365DAB -:15268E006591AFC75C3061C77B237CE26C5D5D2CAF51ECBDC060 -:1526A3007F53E44F7092F13109F989A7113746B6E2C319880F2E -:1526B80027CE3F132F89B399E383A67B3FA9F5886B3F087BA603 -:1526CD00DB388F603F272A6C1B71BE5251E0FF613FAB3807990B -:1526E200DD0FEA75955F18931B9D3D21D421AFE17A8F589B1E44 -:1526F7001C9E74EDA33AECEF63A3F96FC977E57CD9F39EF47519 -:15270C00E951E9335250BAC6FE8EFD35FB2E7B990DB1AF319314 -:1527210075B30EB683FD2929DA5F628FB147D9436C23D3D8036A -:152736006C3DFB1CBB97FD015BCDEE66ABD84AB6822D67CDACF0 -:15274B008935B206B68C2D6577B07AB684D5B15A16669F66B73C -:15276000B34FB11ABA7E8FDDC616D355CD3E49D7AD6C115D55E8 -:15277500747D82AE857455D2A5D25521AE72BA16886BBEB86E5A -:15278A0011D73CFB2A1357A97DCDCD5C21FB2AC95C41D735C7EC -:15279F0075154FB902D32EE5866BF60D57D18CD7AC9B5EFE0F7A -:1527B400BC0A3FF42AF8C857FE875E3E26CE181FB7D6B754E111 -:1527C9008B4EBA3DE9F151A61E475A15A519F673353D8FDBCFB4 -:1527DE0035F4AC48F48C35BEF26ACA1FE1065BCDC7C95E5024A0 -:1527F3008D2BEAC2E34A8CFE93F49F5A785C8C2BB11E522DF667 -:15280800DB55D54ECBB7D3244A8BD96905769A87D292765AA167 -:15281D009D964369A88FDA14B02B2C1AB6EB825F60D8AE037E98 -:152832008061BB2CFCFEC254262AC16651F9F04B5828BD8D33C0 -:1528470075E1016F6899A8272AE2EED41AC549A9CE776631CD9E -:15285C006B95077C671A843C887FC0BBE10F78073F38BC2BA2B2 -:1528710077946E225D7EBD41176D8F2F361DDC3938473FC66D43 -:15288600189561411343153E7661037E200CFD1465C2ADC02FED -:15289B0070A878ACFCA96FDBEF99CA9BD485A661D7C35EB1D235 -:1528B000A3942F8A754A65A129FBC8A6BFC93D2A65F38CBB9EA0 -:1528C500154FF6D9B0D345FD63E9D988ED64F947AA7C42ACE7CD -:1528DA00A8563C48B12EAA8A5891B9F6B3F043F310AF617D2323 -:1528EF00BC8C477FE16109CF32332FA4B6CA91067DA2B241C487 -:15290400A998F8AEF70EE004BFE12B3046E5FC6C19CEE49A35C6 -:15291900840B529EB84FAD33F3D86D04FB6DA63714691D9F2168 -:15292E004D91AC34A6BE67C2BEAACE99AE9FA98648037FD3FD64 -:152943004155AA9389664ABCBD4E86FF8C5209F9ED634A2D354B -:15295800B9CCA81171196A4DA6002E55C012F594521B8B0DB4AE -:15296D002F9F29D595F8E27ADC7DF1C575B847D1D7F1B090F94B -:15298200C82BF818F29DF489B81813CB7844F8D946901E4BCFE8 -:152997005E4D79A2464CAC776BF659FC188F88B5932DD699FCEB -:1529AC00709B75469E6DB7E3F076D9677810F764360195205DD9 -:1529C1002461182CA141FFC1EFF796CB77B0F10EC3AFCA752C4C -:1529D600BAD39844BFC655C35A07B2CE2DD7A472EA449D549F2D -:1529EB00386783E768AFD15516D72431FFF59A9973E3D1FFDE24 -:152A00008FFECD579F3664F575D21913464495EF78E9A197A820 -:152A1500FED7FA918EB41A4A3B302DAD94D2764D4BDBB69CE0E0 -:152A2A0052DEEEFFF243EFD49262C6FDEA25633B3BC3E7AF7812 -:152A3F00476FA9F869EDD7965DB17DA5E362BD6D41FC027C739B -:152A5400845EB160C5395D4E0E1A9EF223ADAAFAAD7E664C9A2E -:152A6900BEAE5EA193637EF68DF52D0D618EA47698F10DF3161F -:152A7E00E91D1D7828603FAD1D7EE8974B0906A2E92582EB9C07 -:152A930021F17DFAD736BDCD6F89D05CACEC330967F1EBCB57B1 -:152AA800D5FABAA9BDE8CE617624176BE5C33E1F7483DD077C9B -:152ABD00ABDFA1F4FD07ACDF2FD8BFBF7DE00CCDB7C9EBD3C29B -:152AD20060477FD89FF09C3180B7ED6C8CC7BF935BF7C413B97E -:152AE70075581F3830FE356DDEF9FD5ACEB937F4BBD985DA799A -:152AFC0063A774C41685FE62AD2F8E8BBE96287FAE4F3E7CC918 -:152B11009C27BD46EF2F98BEF8B1A5D88342DD130F9F337CC974 -:152B2600DCBA912773EF10671887451C98E3090FD90CCA090325 -:152B3B007DF9EDA1CEFAD069AA5BF9078EFE28803BFABD611FD5 -:152B5000620529BB8F2B02FEEF1F7F9BC66081BAB70B6BB57987 -:152B65006A67BC27CE3589F49389CA1F1AD05192A4777CD58762 -:152B7A00F83ABC6BA2F2D726E5DDF34BB5E68E28E5DF115B5586 -:152B8F0007BB4A8C2DE59821279F2519E9AD8B8D1DAD63C60920 -:152BA4006302BC47EF317ED653BA9C3C46FCD3297C13ABEDD81E -:152BB9006D62AC197BC53E47B5186706F725F7D2388B73996858 -:152BCE00AB305E8FBB8FF13ADC113FCA97ECA33AC68C36EC2BC0 -:152BE300261386E4231C85C74CFC061F627C9CF92EDE0D923EE6 -:152BF800493A7F3261DE16E7227D8CD2F11BFBC81395DCF0C751 -:152C0D00E4BA00E96B1827139583E63CB22746AF7BEF205C9AE6 -:152C220067DE4FFB1482A789DAB8807115EEE71324839BA85E80 -:152C3700963C68BE91F1E7EE32FC8481300177A193D733E374C9 -:152C4C00BFF0632179D61D39A7FDE51772EBFA59A7D61FEFD3ED -:152C61007E5925DFD14FF6DADC44AFDEB3936B3D0D17C55EB4FD -:152C7600927ABAFFB645E59F11BA5B383E8C9824810509C4C806 -:152C8B0032E627459FAC182F3EE8A37111C3A55AC6DEFBDB8611 -:152CA000B41AF18A5F357BC6B806FF415FF22095DB0D3C8B58F6 -:152CB50057A5A9A7CDF9A9AF9BD5849BF9D4D7642EF634778BAF -:152CCA00F159ADEE16BEF1A20E85236E9FAF54FDAA217CF63673 -:152CDF00714EE50CC806393662D4A7BE437977D358E9A579EE05 -:152CF400A08E3A3D6787442CE5B6BF60AC0CF62FD980885722D7 -:152D0900AFDBA5539F0E78D6EDD3B7E4B1A9E3631CB16EBAF850 -:152D1E0057DE92BFFFB424E82262000553F033EA177E46C029AE -:152D3300E2FE045942AC5F8A78669FB77CBF906E8EF56AA5A9CF -:152D48005DFDE1D4F3496505D77DA403E7ACE5BAAC72D3EF4371 -:152D5D008CB783BC3AD2B714EBBE25EDC43FEA102F8DE3F709B1 -:152D72003364FF464C0D4BEE937D9AF2D7210DEBC2BE8CFF7CCB -:152D8700BF8881E3016EC67B8D2A4107EB8CA2447637CEE55AC6 -:152D9C006713AD3DBD37A92E896000ED413FA9EB981E5AD069C0 -:152DB100EE8F58E7DA104346FA032EF47445D0D1107E6A8AE003 -:152DC600EBE78E5F1636449788B723A748868D4F0A3C07C84604 -:152DDB00F60B1F837E116FC72362565BBE6BCC78CA443C46C088 -:152DF00029A5BEC2AB539FA875CB76C874D04FC8F58C4C27F975 -:152E0500BE25B72598FA8D29E22C1E07FFED32F7FC2E5D520F81 -:152E1A003F3B9B06C07130B5CFF0F05E3DD068C5BCF3906C4040 -:152E2F00DC763FEB5DE2271E99C77A6B41BFAD2EDEDC6AD1C9B0 -:152E4400D88E7BF99556C15B4437FC96C5B982B888E3047A8367 -:152E5900BE22361FC632D1733A2D6551D6A2C387E1F623D3083F -:152E6E003470E3DEA1C7C7A04181A041BF1DE7284B8B0FA58182 -:152E83006B6E75F03FF62DC4A72C0ABB69511CFB64ADB04BA3BE -:152E9800EDC3D79EFCE452259647F368BB01DB13B28A7F25B730 -:152EAD00EEE2BF38F2C79217A544ABE205DC94A84FA01DFA68E6 -:152EC200C53AB2DA407BA83B130F23A31F59F42873D1628780A9 -:152ED700A7CB3AB740EF11574B49ED33253521F808BF35D77979 -:152EEC00E0A0AB7CF0F399F8E022AE783F1B12FB163ED0BC7DCA -:152F010048F3AB5E218B15F007C99EB288257B32E38EFA2C6D48 -:152F1600C1FC4BF735E7040E689C06FB7F6BF53735EDB313D89E -:152F2B00A3290D75B596D1DCAFB2E4F1301B3B1E61A9E3D72E7F -:152F4000A4F3E93E4CBF87297D58B3CBDF2CFF9137A7E6AFB6EC -:152F5500F3631E1FFD8DDBFF14F32C8BBACB8AB8C362CF8D1B4F -:152F6A00D79F94EF6882BF8B3A1AFFEA99535A2E9917B2DADB5D -:152F7F0085B84805EAAB5D38FF68F9838F8933508A3A42764A45 -:152F9400C2F0A716D5C97F93CE071ECE5E4AE74FAFD30D9B3808 -:152FA9003B48659BD4678CC99F71D2890C1173C9E2C33F330520 -:152FBE00EF5AB19D267A483FAC233DE8E3F0E6C4CF7A8D84A7CE -:152FD300CB6047E496899F7133E1E9379BD41EF337D7313EE251 -:152FE800B62DD26E5E86EE13361CBDD48AEB6E1C34A0034B3494 -:152FFD006E003BFD3677FC17D2FBC25113FAAE83B39387B2F8C4 -:153012006EFD7516BFF3110B22544A7A79BB7196E0DECE629CE6 -:15302700A5C2FDD88FF2A7AA8DDCD3B5FAB7E28B6B3B972D9B72 -:15303C00A22BE631F8892E13FA539EF428C98F35869A8AF63372 -:15305100E557A6CF57A9C3D7D4D213172E2D205BC453AE8936F5 -:15306600105F167AB6B7BD562F8AD4D617509B472BEE5C3A3F3C -:15307B00A5D25C576D94A6C286E46FD43B9FADE5DE31B2FBC612 -:153090009799CE1E37621B0A5D5D6927FDB1AA56C65E6AF49146 -:1530A50061663C7CC0D785F301FF49DC53CB3D7764D7834AED9C -:1530BA00B882D5B69C0A939C5AA6414F9FA74A61118F54C869C1 -:1530CF00B241A83FB22B2695357F3E3F5C3676502FB3D7338382 -:1530E400340F63BE65E3AF9801E9B25E5759F419567EA695B16D -:1530F9002B5C61FFB03428BDABEF53BD75D005C32413E74B43AF -:15310E007A49E864AB2FF20F4BE6D3DD73AE4FF8AD601D6FEEF2 -:153123000AC4C23B69FBC7C4F9159AD78BE327F4C07CD24B94E8 -:153138008EE18FFA3F97746FDCFB97E7D517C7F2C82679C5604B -:15314D00A9E78FBF41E3687EEA6903B24AC411A0FE07683EBE55 -:153162005AD6BB2442BA0CE69B07BC86D05F7EFC0CAF75749694 -:15317700ABBF4BDF546719FEDFE99BEA2CCB6EA6B344DFE129A5 -:15318C00E7FC27640CE1CA57F985A505620F0F783BB53478FAFC -:1531A1001754FF29BE9E70B77F99E19CA917780AC54732780A6C -:1531B600A516D5FAAE604FB963587EFD14E473685E6A562DFD13 -:1531CB00368A5325E25E905A20EE06C9F199FA4FF369BD67F568 -:1531E000BBFAE56B691FF080BED6D87D9F78DFEAFBFC19FA8E7C -:1531F50032C3D73E7EFF1710DD4B2147A33DFD6DBF9966BF5070 -:15320A001FC55AAA8B9E6BDD79A27DC63DAC9F6F201D3DF78709 -:15321F00BD4B54F5345920295E2C91DEA55C3083365FCA381F10 -:15323400A4FCC4DCCE2EF280745587DCBB65C5BB7A78EC3BF5FD -:15324900B73458F8BC85BD63F975517BB7C05E095F143805CF3D -:15325E00C1BF133EA2E5296F9D9367EEE94B19BCCFA5B28ADA53 -:15327300DE1F2F4CB420EF56ECE54447FA117B31E7CC29BC3BCF -:15328800E0397B4A37D26427D1FB6AF50B4B71073C93CBF3EE4B -:15329D00D8F6D04F491FFC89E1535F3E50A3FEC85C3669F73195 -:1532B200BA6BD88FF8AAC9F5DC7A86ADB46BF8CA72ABFC49C28D -:1532C7005BD0AEEBDAF2C796DECE5EA813B68E2B2FCAA20E77B1 -:1532DC00B9B394A7E3A90B5A58FD8F4B908EF99154E5CFE1F98C -:1532F10019CC91D15D49E89F285B803D65C225BE1F33BFE7B062 -:15330600C0EB3C957402BBFEA229CF736B3DD6737F813ABB967E -:15331B00EE86A7C8D2CB51BFE7EB7B74A1037C876405E9576696 -:15333000E4794D8924F4529A3B443C16C53A83F361FF34A7745C -:15334500495DEB75F8193265A7987794129A3FEC7947CC41785F -:15335A00F731E61F67EEB1E7A119E71FCC3D9883EAC599FBCC51 -:15336F005CC3D5316BAEB1DA5159A9FA2B730E74099A977C6AF3 -:15338400B7B9E5BDB4AF20C9BB0A08EEFA48A2CEB1FF4A691EE8 -:15339900439ED5EF39F4EE349AEA2CBB716254BC37F03E4CF834 -:1533AE00417996BC6C486557881F39D98D5D3C37998817533BB2 -:1533C3004A72A41F632E27758AA34EF01A78AE5AFDD901F0D4A9 -:1533D800C5F71DFDCC8699607DA3E7591AC3EDC6D65F58F3BB94 -:1533ED005897A5B6467F951D5F8190E5EFE1B3CF1924432C9F18 -:1534020074CFFC2B01EB77DCCBF23748AC707B0ECBC77986F8A2 -:15341700D8D46F3B4DFC2D4D4C1711129DBA46FF6DF46FD0FFC6 -:15342C0030FD8FD3FF04FD2B3FA2F73FB2F28ABD83A0EAC46896 -:15344100E467C7F0E1884A1DB1F06F555B97B0FA5F755EA47C51 -:1534560015FDCF100EAE926CBE6AB2FA761EFB4B7B9DAD7E8045 -:15346B0027E9B947F5B62834AEC7DE465F470DC4BC14E73EEA46 -:15348000BB39DAA977F43BCA1FA7FCB7B2BDCDE299DA539A5FFA -:15349500340CF4433961C0BF36B4E298CE627B39DEA3EC7EF867 -:1534AA0063217634D5592CEA7C45B429621B7D601DC77851E412 -:1534BF005433F2A3CDB9A11BFDA9597082F7B2ECFEADF0DF0892 -:1534D40066CFECBF799A1AA43993D59FE216AEE1DB316CF5B34B -:1534E9007E888B36C73B0DAC81948C1DD3156AB7247E54878F79 -:1534FE009EAC4E4DC31A888FD202E35D7ACF84A7C5FDCE47EF92 -:1535130042CA7FD3FD64878E601FD4D97725F8FCCC155F697AF0 -:153528000CA57FE37B9C131A0922364775EB55BA7B953A1D3188 -:15353D0072FDB14A3397CA5C0BB142F9BFB61B56BC617917D2C3 -:153552000629CD1F1BA03967917E71B9749757E9D0C7290DF1AC -:153567004BBB903F5669E07C8D8A73A29426C706CC61A4D3B355 -:15357C00417C7B9164217CFC6BE63271C68307B23609CE1C5FF6 -:15359100F558F1B2B6219DE007C079471077F45DAE9C7F464330 -:1535A6003F4AE11BA48C709FFF98BE8E6CB339AADC92973A2800 -:1535BB00E2B610FCC5A114F2EFED90BA7B853F27CE18DE966C99 -:1535D0005AA2F82D5F0BC466982DEA1C3AE0A33C3E2B4FB034D1 -:1535E500292F918EDC589645F304DE0C9AF7AAE658DF8082FF11 -:1535FA00BDC3E7E373E0979EC8F887C9EAA4D95A427822B92460 -:15360F00137EA2F4CC66F0E72F25BC5BDF3CF96B737BEA6F0F36 -:15362400C897DAF5CBC553EBC7F744DAECFABDA1B156CA6B50E9 -:15363900DE7ED4B58764E75A196B3AED343E2254FF6AEE53F13D -:15364E001C6D853FB7447A2EE9C2A65FD5CDB504838C33722494 -:15366300A7F17D95F96A3B87DCDC537646C37AECAAD43F13CFF4 -:15367800FEC05C4DF724F1C25ABAAF4E7DA61FB410FEE76AEDB5 -:15368D00011FD5514FF59706587E581DE0169C5FE8079C388F73 -:1536A200BD92F475D8309EF258EB9EB2360DF23E42EDC4A82EF4 -:1536B700CA773C4AF7CDF41FA1FA733167184D7C436AB919A3B7 -:1536CC0076A2A9FDFD38F3B09ADA89AA3D070E521E8DDA3AAA9F -:1536E100D8676C4987403B84C0923D6549AD551D306304D7662A -:1536F600AA7F82F07335C00A7D54E632DD714E9EF8CFBC46CFF7 -:15370B00ABA88E8900CE1924F8167A7E35007E575BDFA4FB6AE1 -:153720004A93296D989EFD418B46D371ECA697F7525CDF4C7926 -:153735008B55B939C745CFB03A48B8867F31F68427699C0F9A63 -:15374A008A4A73DA349A875F9B2AAFE12FA284734806776564EA -:15375F00301C123057DF4DD38107E71CB78D7051CE386594ECF6 -:1537740018B4E4DCB663960C8AEE35E0D33217320A6B58888D3C -:1537890019957765DADD3669CBEF1E9249581B3C684A65713D24 -:15379E00E37F4678A0692F9FE62E23389BE5E3AC06D9408DFDF8 -:1537B30012CB273E32A89F8D7E1AC705EA82CFACCA63F9F3E96C -:1537C80019DF929195DDFA28F169BFC20ABFCCAA1A494008FC7C -:1537DD003E42CF09C5C26B39AB6A8EDA721FB240C04675602E4B -:1537F20088501E12E685CBE8AE282FEA997874341F5FA8686FF7 -:1538070084CFA788BD46F7ABCBBDCD0AE5DB5A7CE31872C60954 -:15381C00F6CC300E2798F50D3C278F9FF860A7FD9DBA72D5DBD0 -:153831005C4DF5E4975F213A1D9A820B85FA73167CA3DC26CE74 -:15384600D0EC8AE13B033DC613915ED1FFFC4FD3FC46F800FFDC -:15385B002D25B4416F7FB508E30EFD7AD1C01CD1C83A455EA932 -:153870002CAC77E663AD63C0AC72FAA5741B32E916D5E0BD40AC -:1538850017740503FE7E0AD581323EF5457AFF2B33BFC82AC7C6 -:15389A0094174DE0783BE5CF75CD5B6AD1D4F59B6B45AC3048CA -:1538AF0079268AC0F35546428C936A314EE0DF0499FBE6F5749D -:1538C4003EFC750AE289466FB45A57D54AE3CA72A97994CAD023 -:1538D900382EF4BAEA2FB6CFD665ED55D598781B01B576EAA8ED -:1538EE005B39FF7B22D6307CB5B09624931C95A9BE2292F7E8B6 -:15390300C7C44303F50FD2337CAD64711EC8D603E0E3F536F634 -:15391800F82CF8E5D810C9A4170D712EDDD255D3C53407E3FBCC -:15392D0055B2FA8C69CB9300BE0D09F926C33FC2FEFEC424D5C1 -:15394200F3E318F1606CC85E334EA7FF6A6CB0D14FBF713687E5 -:1539570045DBF9F642969F5B4934B4EBFE2DF5DDE90BD67050D7 -:15396C008785AB230257F0FB0DB1458D4E7F0AA80F93158B9A3D -:1539810071CE7372162BACB8981D3F326414D96517C986FC2802 -:15399600FDC4FE9B809FF409C0E21D233B3B3A4A750D4057248D -:1539AB003C7467FC45BC946FB480E5DFA30276AB6F778D250892 -:1539C000B735A60337F611FFC7B19F1CC5FA83A82F84B58C55BA -:1539D50007A03FE3BD903D36BEEAA7ED4F59E36515B7F15B828E -:1539EA00FD0F3FE5298EC9CD9B73B26347C9AFC1B7BB047ED1E3 -:1539FF00D6BCB141D2A306B1A79816E71AE9AF3CF242E3453F3E -:153A140070F373DD194F23F6F95EE80781F1A7F4C0F9255AB02E -:153A2900BD419F97929A049F19DD7C07CDEFBE50360E0960AEE7 -:153A3E00639F6A862E3096EFD0CDEAFB6FD177AA0BF97136C947 -:153A53001FB3E28A20CDDBB448C46C9745DC120BA6BF2298E058 -:153A6800DF081AECC7593A9A0333F44D791BA103CAA9534601AC -:153A7D007BA57132ED6D9E97F23607A7F58164880F78925343FB -:153A920037A72BE1183038FCE84F9D30FA52DE9650D3908009B9 -:153AA7007066F4D570B5A08B22F42AC0FD29EC41091CCD8B0F3C -:153ABC00D43B78D94C32D76BD3CD473A5451A5D468F5CDC2C5E5 -:153AD10075C1E30306C64D89DDCE3F52F98FD3DF85D4DFAA4288 -:153AE600F437ABCF839FB723662FF1815F75F529F6B2D117930E -:153AFB00B27D52AD3E59F850459F9CF3D2363D44BF0CD798284B -:153B100076E10E7A01F0E6F4674EE84A2BC9419A7F7F6EE6B539 -:153B2500D3F852F6F0373C969E087C6C60D9710F19B839730EAD -:153B3A00D7D28BC4B96ABBDC412A071E49A28C4B9E857F379504 -:153B4F00FFFDEA51923983FC4F2343B5CA8E11D12F5FB2D374B5 -:153B6400FA0C79017E2F16B1E59F35DDB20973899C7CD6EC230E -:153B79005D5321FB3E4032DF9F841CE3A6D5CFE12C9D934346AA -:153B8E00A8E984C04788FA60AF6F171440BE8AF1C5752BEEFC13 -:153BA30015D1DEC2152FB8C697859FA2D38322FE2F70F7C8C3D1 -:153BB80096BF2BEAFF0EDB4B7C3068049A3A6DFE1FCCF0FF61C9 -:153BCD00E27FC0073B05EB7C820F62E003C3E683D10CDFCFCFB8 -:153BE2009FCAF747057F0E66E9AF8E18A82BCBD3832EFA774D11 -:153BF700A33FE0D96BF537293763ECB8C70C7ECB49C4324A1863 -:153C0C004F936CB360B6FAB98BF8DAE1E110C1574C7CEBC07AA5 -:153C21008D602D2758DB7C37F2ECABBF01BFBAE08D11BC311723 -:153C3600BCAA1B5E4B36BAF502A5A953C0EBC8216B6EE8123030 -:153C4B00CB31CB87CF8824DA8A5C7362EADA541EC4B91256DF0C -:153C60006BE0FB53B01DB5FF952ECCF01FD92E6F2256C061F98F -:153C75004E2566D92FC591A33AA972C52595724BE07CBFE6913D -:153C8A0058600EDE8D8F18CAF9A426930D739CE055C8E6958910 -:153C9F00C7B0AEE5F321561CE721A2A74AB64FFCA9DE960EA415 -:153CB40077FD33E6910EDFD953629FF44AC5DE3BD8F8A8618648 -:153CC900A516D4539ED88B98C1C1B988EF41E9896EEC77ED3513 -:153CDE0065AA0F7B61E237B52B8BB5FABDA62887B68CBD387FDC -:153CF3003CA73C2937B65B653AE26413E16C936F2DD785BF237A -:153D08007C526C9B08B0A2FE9DABB996B36E528FD370E9FD2C8B -:153D1D00D7D06799CA94278E6D02FC98CF010B60036F2E2318BE -:153D32004ACE9FD4E662CE7FFD59BD98719A2F92DAB7302FD91C -:153D470075E2FB086DD4579473FABE8BEAEFDA7742F851827F75 -:153D5C0044DEE84887AFFB9FF51460A33EA12F6CF220CE5EA6C6 -:153D71008107D29D39F0B9142C4BEF1D5C5CCCE0C16A2B830789 -:153D8600ACDF8D5B78087D576EEC5A873DC921DE4EE9BD185FB6 -:153D9B008413A4C13644AC330BDE538483631AEACF59F76B7D0D -:153DB00087C0C3312D40FD030E149C3BC6DA3BF4326A0B310BAB -:153DC500C3D47E39C941271EA1751E24CED93B8CED29EBD2DED5 -:153DDA0023DD754198FD61952ADFE5C45B1FFEBC88472874DE64 -:153DEF00D5C2AE5A7420286268EE16DF804059E2EB7CFA3D8C92 -:153E04007DC0F17F72C5B3251B113184845E087F7AF8A685976F -:153E190071863C4ADD01D249C6E2D5DE16C957A3CB91C5FA20AF -:153E2E00C18AF80B48AFD0FA750573907A6FA34FFDA346457D70 -:153E4300A0598EAA3ADEA54847C77DB3388FF4E722966149836F -:153E58006A5AF51E860E34B68CDE5568861E8E0F36D6501DD54A -:153E6D00544795FA40A35347A9783FB58DCBCB1F10F5FA45BD41 -:153E8200BFEA70F25ABF0F1B89E57D778A33DA0D13565B510BB7 -:153E97007EE0EAACF0EFAF36A3948E39F62A6385D2EAC5BA120B -:153EAC00818E68F793F20D8A7C61BE01E58DC526F28ECD90178A -:153EC1006D6F07ED92569E8337C9B30163D3CEB3FD2679C294B6 -:153ED600C76FE7D9302D4FAE522FBE37847CE095ADCB7F762708 -:153EEB006425FA21533F719F43F2DCA79AE64CEB596166FBCB27 -:153F0000638C2A8363D86F147A0B3DE34CAD88371B8D0BDE2D37 -:153F1500B1CECE67D68424C9E2B74CBD549FEAAC1F093F34B224 -:153F2A004F7F90C3B07E029FEF94A06FB6BC150BEB8881746A9C -:153F3F00D3AA9FDE958C3FA707CF3FA7C1462DA1B1126C1A1181 -:153F54006397F836A0B013F598673FF7560E53E3234B133497BD -:153F6900FBC9362A461F146E5A3E6FC233A400318BFDF1634B40 -:153F7E00A04B237F10F53B700839DE65C11749D48BEFFDD9F533 -:153F9300CE8F0F2EAD99566FC60EA6B941949F617DE61FEDF10C -:153FA800877EC15626788B2F63DC2855D9F2EE785B347E71160F -:153FBD00EB9F662877745A391A9F379C27B4CA1FE23F9FA1FCAC -:153FD200D68F50FEDD19CAD57F28BC87F89519CABDCF3EBCBDF5 -:153FE700D434FD0AFC1274F31FD6D5FFC9F54DBA19DEC7AF7EC8 -:153FFC00F0FB890F7BFFEF5DFFB4F77EF778F8A0F5D6FFFFFE71 -:154011005FF55E71E1BF789A7CFA7F077E9B3FA69D399A78FFE4 -:15402600C6F1F061F5B9F94D2A3BA2F779129B3F2ABF61BCCE52 -:15403B009155FE79711EAABAB553896D5E49C3DA1FF8828EF8BF -:1540500077F80EB8FFEE6E1D631E3A823FB0459FB5AA5B57D5B8 -:154065002FF15977B7EBC1755CF34B957AB0A8524F90CE66CB4D -:15407A00874DD7482F5102D53AEAFBD7D675680DD786E173B5CB -:15408F00AE4A877F33BC776435A7E57192F925FE4ABD605D8D23 -:1540A400FEF5358BB58A758BB5907FB3DE99F37B1AF6A316C828 -:1540B90031C4C70922AF2C7D4217EB40ABDA850C822CAA284A4F -:1540CE0068F08372DE178BF78B756F202EF4DA8A07E3BAF0CFA1 -:1540E3002438CFCED0FE4ABBFD426AFF10B55FE26A1BED9653F3 -:1540F800FBC827EAA5FADD6D5FB3EB9D70D59B4EFF34ED474C7B -:15410D00C55AD6B29E4C18D41DCF8971E022CDACBA6EA7297B4C -:154122002EE1C54F6DE6AF5D4CF8A9D416F86BF4F99F965BBC93 -:15413700AC7D63C51FCB2D87662704FEB12E457378106BA2B712 -:15414C0009DD240BBB881D01FD90C59F147D2398CEDA308DA2A4 -:15416100EFFE0D7AC5BEF5BA54E4C096BEEEC0D648B095FA2B21 -:15417600457A9C14638756F94535BA5FC0D4AD2D284AE83D3BB9 -:15418B00F764F80078FE6D3A6DC3C0443F71F6CEDA779D78128F -:1541A000ED8EDB7048655DF8269C6F36B76008ECABD203D41E5E -:1541B500FAD662FBB8C3394CE0252F8B970AE29BC2B54D7AC9E4 -:1541CA00BA7A01CFEE9C6EAD80F052E84FE8B92CB1718FCD975C -:1541DF000B45DFB3ED5EA1B60C7A17207C11DD8B1D1840FB8A9B -:1541F400D51B34D8DC15EB3668D3E94F83275020CE13B2828A7C -:154209003307C57BE95C8D5EF2604C97D997F45994E780C44203 -:15421E005EFB791F3D17AE23F8884F0A8BEA75FEBD06EDD0EB49 -:154233000D5AE1B9B57A09A7B47DAB74FED97B88DFEFD140FB92 -:1542480012C265C55A0B07724C6A51D9165E4F38F34A0FEBFE75 -:15425D00580E62F807F3B15753BEBA7596F4A8EE9757EAFE153F -:15427200D4D6DD8FEBFE55F7E87B73566A5823975764F3E7852A -:15428700AC3324227FA2D6CAFFDA1775FFAB0DFADE9DB59A97C5 -:15429C00E6ECC0F7366B159FCE69C177627CF1DA8DF9630D1B06 -:1542B1009FC6B78679AD5E71EE615D3ADBA073CA2BF9B2F8DF16 -:1542C60086311D12674E362176B4AF9DCA9D6ED828ECDA65ACCF -:1542DB00253710DE981758B6B1A26BBDB69B6401E982C5BBE8C3 -:1542F000FE879031FFF331DDBFAB41870DA1AA8F72B16F98F838 -:15430500A22EADFD922EDEBDD640EF6BF5BD842FD01C7C0DFB89 -:15431A00ABE09B524BC539C21F6FD74BCE7D512F3CDB2DE8DE86 -:15432F0043749F45F42E88F08D6E39045A835EC25FD7A623F818 -:15434400F06E82A505F0138E11377A1D3D2772B66AB3A81DC03C -:15435900DFB9D37ABEFB7ABA0472C8F98DBC34AF6C3A4869289B -:15436E000B7E36C98C04FE20E7C8BE9CE3F0D276CA237CAB09C3 -:1543830086ADF41CF8DE7CADE26C29E1B3549F896F7EC9B27C78 -:15439800F377CCE21BE0BD80F826E4DF2A70F1759B77C03725B1 -:1543AD009CD2A6F14E77FCBEC70A425B8826B1D66EF6E863B372 -:1543C20042D156C9FFB8EEFC2E8C3CFA186833AB7DFD46F67A95 -:1543D700CB46E75EF1AE477C1FA220BE7E63E158CB46299FE89F -:1543EC00FC894AEE25DC5F277A0367B70BFC7B5A0A7907E1FE98 -:1544010071C2FD1E21B7DDF8CFB1F19FB0BE4B11947C9FA0B6CC -:15441600A39BCE085A8057A29B46A7D102DF6D7BD0A605C9D76D -:15442B00E2F52E5ADCEAA2C57BC287303B8677D2F8ED75D106C1 -:15444000EB55A03BD277D8F4394FB471E8B1659AFFE787D1E3D1 -:15445500828B1E7F65D30363B8C4A6C50D7420DAB86991177966 -:15446A00E4B1DCC8FAC7D876D6E21F7B64E32C65CBC63CF69F69 -:15447F001F2B88FFC946FFD8A3E277C51F8B315AEC67F43BF207 -:15449400258177794725F7908CBD9E17E5050EDE696C16FA775A -:1544A900929CBB5F2F5CFBD414BC17CC84F7AE85A0B90BEF3177 -:1544BE008177A7BF6EFC936C2FBEDBC63FD67C30361CFC17BBB3 -:1544D300F0EF116B37167E7B6DFC164136D13BEC33BBF9DE2957 -:1544E800FF4B21FF2D9AA19C887B69D3C1C279FD14589E408C43 -:1544FD00AAA4D48273D5099237B954C72304C3A17B37EB15EBF0 -:154512009A34256789969773A7061EF693BC61AF376C3CF4031B -:154527007A776EAD569CF3592D3FE70FAC77D2CA8D6CCD3D1BF6 -:15453C0077C73C2D806B2170522ED6B603B9AA47CC8548473C72 -:1545510037C7A641FBD89BCA71E6687B9E403EF80E03AEB7C9AB -:15456600ECA43C99F1FE1A8D77CC5117D26905EB41D003684EA5 -:15457B000BBE6AE7FF163D57BC2BE35E7CD2EA77C1FF01EF9849 -:06459000C0E6B892000035 -:00000001FF diff --git a/drivers/atm/pca200e_ecd.data b/drivers/atm/pca200e_ecd.data deleted file mode 100644 index eca84aa7e0c..00000000000 --- a/drivers/atm/pca200e_ecd.data +++ /dev/null @@ -1,906 +0,0 @@ -:150000001F8B0808AC5A10380203706361323030655F65636428 -:150015002E62696E327D00DC3A0D7054459AFD261333136278A4 -:15002A00192663E02479728060A10E9063213F64F0700F3DE05E -:15003F009E6CDC7B2F3514B35EF0A28B9A5A731E554B91474C5C -:1500540034E11AB6692618B7609D8404A2121CA8648D7551435D -:150069009DA578A56C8AF276A9AB829DF3AC92DD52CC5EB177A0 -:15007E00D4CA32F77DDD6F665E263FA25B775B7753D5E9F7BEA8 -:15009300FEFAFBEBEFFBFAEB7E79F4A91F6C270A21A1870849C1 -:1500A8007C974CFA8536C11F37B9A99FFEAD9C49302569258321 -:1500BD00D8EF4EEE6E14EF59E3B3EDFED3E3C735EC67E50822CC -:1500D200A9FE0FFD29BF7CEA97A26F4EC993D537AF13234A5E2D -:1500E7005EDE94F3BF245F4AFCF1F129E7CF9E866E0ADE2C3919 -:1500FC002BF0237F849F3240F688FEB5EC75792D39E3BCB43E9B -:15011100C9A9F54BDE24FFBC9C3C6987DDCD33F3938CB0674E4E -:1501260078D6F8D7D63FD9DC8CEEABDC4824B2F9DC949E391965 -:15013B00FED7BF11FF975E7267F17D1CFB4BE77E3625BFBC0C26 -:150150003F0FF9BFFF5372CB72671A1F3D3EF99DF51312ECCF0D -:15016500C070095C0E5FF8FFFE4B3A7E246851FDD31C5230FA46 -:15017A00FC0A35E009832F79ADB5E45140A3A4743C8CE3E39F62 -:15018F00C35BB09DEAFF05BD7A95BB3DADE6B56DADE538465425 -:1501A40052C90E11EF08B4773A8857FB013CB7112F090619CEAC -:1501B9005B125380AEB695F80197D874FE9A9022A5D554ADE572 -:1501CE002661CA73EE80B5F5F26AE22D7F9A78FC814838484AB5 -:1501E300E8B36DBD4D843D4C4930CE42B06FCC091861CFB9BDAD -:1501F8002621C3B438D010BE6DD7091AF29090DFEA334930C6AA -:15020D001187E86D9CB09E2EDF18033C8DD220A9BB6D57390DB4 -:1502220011D2D8B26F23C02CEA0FAC0EB76CBADB3C4F48F1BBF2 -:150237001157A5EBD25FC0FCCB804A3412ECA211D133EA167DD2 -:15024C003B8518510311A53A5FDD62226D9C4BD46AEA567ACCA9 -:15026100362DB78EE8A7683E21017F201E4E927EEAB6169944DB -:15027600AFE1ADE3AEBAC0C53534B0EE4194CF8AC2FE47C6065E -:15028B007960DD5253D1FA6834346000BC45C0D909BE0A681025 -:1502A000BDD7BA4BDBBA12ED8A7C09EB8EA79BDA6BF9816681AC -:1502B500F70EF3723259F4518D59F578B3AB0A66E7A3597F0E69 -:1502CA00BA90E04E5BEEC669E5765D2A33DD6762936427C1D5C0 -:1502DF005CDA40CA8A7AA03EA807AC0147BBA02E52A72974180E -:1502F4007B956F461DD851EB3EA14348C8A0EA9689F2332DA72B -:150309000E7B941FFB00D8FFD6801526637B69AB8FCC22A5F03C -:15031E00ACF65863355BCB4740B7F5A05B6A3CEC239954156CC1 -:15033300E7B09E9AA7F084F085DB760DD171378910B6285EA406 -:15034800F64A5F403DE05D8BB4C2F800BD8EE3418BAF06B8AA3D -:15035D00EE81F5E96393DE6D3B92E0385D564748698085091946 -:15037200A79EC256E0D34F49792B1D759310AC032BD6FBCDCEAF -:1503870038D845EFE5456A87F95932097ABB5B050D98BFE30F8A -:15039C009CDF2BE6B767E667E6C6EDC6D24DB7E7A56AA4888777 -:1503B1003626DE3B6D253EE5C5810BE19CD8095A7CFEB241D8BF -:1503C600765A663C6DAE8CBC4EF7B70D35420264F51833C16105 -:1503DB00A6438F32018C232C303A64E29A23DCADBDCAE604CE52 -:1503F000C2DAFC0BE48392B027D20C3E546386122FF0964DDB3D -:15040500C0A7BEC35A366D323B120AE8B357F8531ECA1ED46DF0 -:15041A007F6AE732A6800FFA49302E6321B8C48EB97E560BEFE0 -:15042F00458110CC6910FE9B84D825C10415992A67940623CBF7 -:15044400E9EC584E5DD1912DB4E84C9DA9C486689188ABB8F0F0 -:15045900BD43E494A124DEA49DE43503E75D87B4D6F9E7F81CCD -:15046E00E748EF05F296419A062866F84EF23AC04791363CBF24 -:150483000BCFC31CE5D213EF71C44759162BA4E81F2077148DF9 -:15049800DE677E1BF429501F117ABAB5A3E037FD527EFD21DE68 -:1504AD0072EB2653890C502FC844D803BC937403BD7E2113CE66 -:1504C20027FA51FE0EC4AAE7DCA04906DB38E62BF04FDB0E52E9 -:1504D700EFC24B09339A731CE3886F2C203A191CE0A344E0591A -:1504EC00183F514DC49F88258C471F213EC2FAAC68A8CFB85650 -:15050100D6535DAAB92A3CE7C0EFCB0728CC6BDC33EBBE3AF4E9 -:15051600E76BC964B19EF8949519FF64CE568E091F74150C995D -:15052B00885B1C83D82FEF43FCD0E167A306513B39C4E31CF4C7 -:150540000131A6FE965F4D26FD9E7387CD79E78E9AE46AAF90F1 -:1505550009FC2A0E7E2562E5D1C8C62AB40BFA87E7CCA98C1F9A -:15056A00E07CDB0F02E0079ED07A136DD5DEE892EB27D74DDAA8 -:15057F009075F0D47A1E222F1BA9F524FAABBC1763C2F6998923 -:15059400F69376FBD1FB4F007E4396CDFA85CD8A1BD166C3B678 -:1505A900CDE268B322323660755A03C6B5E64D2B053DCC1D2390 -:1505BE00D266445F1497ADAD0B68E03E15BF6D6448D8278AEB56 -:1505D300C80678BEF73EB0C30FE947E092E01FC585095735DAFE -:1505E800F671D7EE55CF245C958188AB5ADA037C046D01BEE121 -:1505FD00BAF4A9E9518E9B1D5AC626FE09B121732DAEABB48BBB -:150612008C15B459DAD7B3F32CC428FA34D7B6547ACE7D067369 -:15062700345B4F0631B39A266B102748855D9AEE95FAA9DD5677 -:15063C00D4EA35EAB4875792D2583897B499FE5D3F12FA91FA31 -:15065100A3343AFA18E487C7B823BF7489DC027E87B620FA20D5 -:150666004FD1F043DE9AE5B0C528F877AC664BD58D1BD21EFFFA -:15067B0059BA7B79AD423CD23EFF6EAE509A67B0CF7B609F6360 -:15069000FF23F63989F6D9BCD64CED8550E85072F557D21EB076 -:1506A5004745AD6EE339DB1EF3C922D37F7DA9B0478E5E629653 -:1506BA005AA5D57F827B8FBE9F46125FF04F66E1FE5412866761 -:1506CF0086F945D818ED469ECAF8A08A7BB46860BB6E87ED4EC3 -:1506E400F114BF6CDB45C1764D60BB8F6DDB5D00DB21FF8083E0 -:1506F9007F83CD7B22DFE3C67E6F5F26674C9F2BE638724555DF -:15070E001A0F7DDA111F0B20A778361F4BE710B11F8EC13CAB3F -:15072300CFB85A932B64C35C82792494788F611E51E60E9B4A3C -:1507380007E413987728E1C8273927219F0C603EF1E1B81893A8 -:15074D00F9A4D8B3F9A4F963E02D724A539F88D97980873AFBA5 -:150762001C3A37E59359CE5C33A1781D3BC1DC9B7BCDA235ED12 -:15077700A29E2C523E379B4988CE17BAF7F3909FE8EF821F7925 -:15078C000AB11608D25AE1474B445DF7FC5CCD20E5FB68A3A870 -:1507A100170E70A2DF010DFCFD7FBBF54429CA4C9ABEA016F86E -:1507B6008190DD315E0F7E5103E34F925FAF825A94A30ECFCD41 -:1507CB00EDC7BD45FA3FEA06F6167AA890B7BE6EEB8ED2E275F7 -:1507E0005F9819585F7C7324B932C5ABCC90B5C0CDF0B262939A -:1507F500695544DE16B4F419E647605EC90313E7DD13D9B652B6 -:15080A00AE1BE31B70DDEC7941C02DC8C25D1129B371352AEAA4 -:15081F003D7B5DDD02EF009F3F4EEA549887F684FAAA68452469 -:15083400AF42D45290DF570BFC56BA0BF015C4D73BF911F04B90 -:1508490037E243DE03FC62DCA7D1977CA206EDE5CEFA7063BDC6 -:15085E00A3BEDB4CC197290D617DA68BDC791A7B55055EA967AE -:150873000D7A477DD7EA98BF20E2AE48D57848C3FD00350F601C -:150888007C421EC69849CFB37FEA060FC6604F20B001CE496318 -:15089D00F45BB141FAE3B6A126DC2B99A8E7346641AFCCBD0C5D -:1508B200FC9F80B3D24E383761AD1C83FDE1320F41BEF0EFBA70 -:1508C7005F9C89FC501BE39EAAC2D98AE8F5D48775DE582DD4FD -:1508DC0079C130D653FB649EE04837404E899AD0B2CF592B7220 -:1508F10048F13F47DC707EFA7B13EB3699AF0DFBFCA4DB755C24 -:150906003B75477AA046AD605EF541B3E5D6BBCD36A0A978FFF8 -:15091B00C6DC8B750C9CBB3007DDB2E7553337827B40B7D80387 -:150930008A033190A792DF42FECCF4C379E3167106B1EBAEB1A5 -:150945001EEEC7F307D45D9DA1DE74BD05671CBE429CA18E43BC -:15095A00BE5B682CD0CC95E2ACA1F6C4DD381FFA828EE5E21D9F -:15096F00CF4F17DE36CBDB9B95EA476A72D279D11F53A6CF9FA5 -:150984002F7597077ACCF25BD6C49886A7633517D785EC80E7CC -:15099900C4DF12320AAD0BDA4E683AB425D008B40B301E87C6CB -:1509AE00A0E9625E4FDC6EB04FF43059BBFD16CF2CA13DDE56FB -:1509C30043BEDBB50EF83FC2317F3629F20C3409C7410F71268F -:1509D8008F2F88CBF60A4BF1D9381D5E9ADF82B8362D3FA475C3 -:1509ED00BA4BD293F8E3643ABE8067E39C2533D1CBD03A3C13A1 -:150A02009E8DD33425BF89326D9C964E46A68553D2C9D040BBF7 -:150A17007F55C31A995C3D2CF1C7A25CE40D8CB1E29881790360 -:150A2C00623586F12B629A58F412FA289C3F647C34424C9608E5 -:150A41007F9B2E4E5E8138715DFA8579CB9E939363247D66979D -:150A5600B181F1823501C620C60CC64E3A56ACA39958518FC96B -:150A6B00B3FA18D457D69F1A6B2156F09CCE223913E224153FF3 -:150A80001F431E9A8D7990EDA5175CF2ACFE817D7D38027114D6 -:150A950081380A7D8D38DA6CC751C3639938FA009E23DF07232E -:150AAA004223D0128F43850E8D416B8016825602ED1AE0753D49 -:150ABF0036318EC41D03C412CAEFD9DF938E27E09B965B03B992 -:150AD400F7BCFF8A21C70726C557AA05537E9F8DEBE047317E33 -:150AE900DEEF81F157441D23C75BE2B2C13A3649FEF5022F9BEF -:150AFE004E8B23CE5AE21F91E9F8B54C8AB35E320D3D874FEF6F -:150B13009A915E86969EC69B420F382B230E9D92DF4499668A69 -:150B28008D7A32959D60BE4D7FE194E3683F394E74A0F3154D74 -:150B3D00CE4DE17F988EBFD4BA8B38D4FBB846C8AC542C4EA83B -:150B520027713FDF91D98F156FABA86DB78CB65588BD1DFC5798 -:150B67007D286614EF1AA4BA479E078B77F5D28847D6AE88CF94 -:150B7C00B0C665526784B9B260E38E7DBC445B88674CB6E10A5C -:150B910021EE75DDA61F635A2DC718F12B780796AE33FA999E1D -:150BA60043484524B702756A8067E58101519721BC73FE108595 -:150BBB009862B92AE8AF77F3DBB513DC1D6B73DC635914F1AC84 -:150BD00087F12E56D25A75B3B4622F6768017E1CF67CBF1E338F -:150BE50015C85F985FE2F23B9EE0F375F4B11CFA743964B06EE9 -:150BFA00521FC48BD74A7D2C873E5F492B4B9FC12C7D06BFA10A -:150C0F003E71873E671D32C46F521FC44B7C47EA1377E8F3954C -:150C2400B4B2F419CED267F81BEAA35EC9E8B3E44A460684DF02 -:150C39008C3E88A7DAFAE0F3AA9BA595A5CF48963E230E7D4207 -:150C4E00F6FDA61A180DA77CBCCCA066BB897CA58FE0FB4EFBF0 -:150C63003D6EBF37D8EFC81FDF0DF11EA3C29781C7CE1CD1D360 -:150C780041FBBDDF7E1FB6DF2FD8EF23F6FB6AA0B3533BC6C47E -:150C8D007E0B63EDDA49BC1BE40C9EBBB49FE2F99F8FC273BFE6 -:150CA200F6160B698BA97DE6E61ACC2B857D695E24B73A10CB76 -:150CB700ADF62572AB3DB00E78DE451DCBB597059D7A98BB5EAC -:150CCC003B25E844E1B9567B83E1FC77A41C0C79D66B7B98A408 -:150CE1006BF18540B710724F0D394B4F6F3BB916715096422D36 -:150CF600B702613FD9F653011B75C0F66E7B4BC050A614EC99A4 -:150D0B006DCFAD4DD15FACC9F5433AF3C4733FABB7F9A34C0FC4 -:150D2000960DAC49D14CE122AD146E4A5694ADD4C645BAF768FE -:150D3500B9D5381EB56DAA3D216D1ABA22EF6F904789BD3FE19D -:150D4A00B8BEC3392EF9DD65D358286174F44989B3DEA681BC57 -:150D5F00FD4803C6C69FC88C55D9760CC3F846B01FDA8EC2739B -:150D7400583BC0F0DC392264BA2CE4DCA1BDC88E08FB76F1DBED -:150D8900AF0807F47DF7466E65D9853BCDCDA56F2C7F612C6631 -:150D9E007C7B2DCAD12E6C940F67B9556BDD952B4AF72C6730C3 -:150DB3007697188B0B79F363B915F3DE7257064A0F2CE7305641 -:150DC800B856CA8FF6CA8738B9F17B77E5EFE6BFB8FC208CFDBE -:150DDD0047756E753E9C577F7DF1F32AA4F9F17C5A85F3FFF557 -:150DF200C86015E29EBF78026AAD06C113E48F5BA22F113283A0 -:150E07009E715DF43B056D120CC555D1370A39E07C18C798B8BB -:150E1C00EDCC6553F93002F1F71A2D10DF7F625CCEBBCC6B45C5 -:150E31002F6D4482116E403F67DD5153D9F47DA8B3F6D15B712C -:150E4600AF04BB49BE31DE2AFA06DE2EFA2E61CFBC3D80BFEF5E -:150E5B0069C0BF9B16068280AF895C26F2ADE81BF9B0E8570B92 -:150E70009BCF3A03F81FFE10F037D1D9011DF0435CCA1DE37EDB -:150E8500E89F15EBB093975CC9EC6DA454033C43ACCD23B0367D -:150E9A008DDA7EA606C6007681AE96B6E141D15FE0E5D037AD30 -:150EAF00245E1674D52944A3FBAF277DE84B3B005EA01D83BA29 -:150EC400C112F6CB81B3F8ED77209E8C2BDC2B1FB171D1DE7613 -:150ED900BC517CDE0D3C55EF0766EB9A98FD6DB39F22BF48E2BF -:150EEE0067DCBF6B08EB5F529F789DC33BB340367FA8CF54BDFC -:150F0300782FF021776B43FC9315B63CDA1DF4C69792C76198CC -:150F1800AFDAF2305B1EAA65E4C1BDEEBC8D3BEA9067740679E9 -:150F2D0074873CB5200FBC3336853CB50E799EB4797C807164D6 -:150F4200CB336ACB73BD2C230FEE55F7D9B8E86F2979F0793A72 -:150F570079420E79D6833CF0CE6253C8F3CEF28C3C977E277943 -:150F6C002CBB827B9A940779A03C3B1CF2E05E735AE20A5E2E36 -:150F8100C8ADADD57DFC7A32994CE55867F917D10659443B01F6 -:150F960039BA96AA810DE1CE35FD14FF4FA873ECB821758973F1 -:150FAB00DDCE291BAFE0A505F1791CFB6658EB6539856F9A5A59 -:150FC00002CE58E939FD7C839D8F53B806E04521B67D901B9DD8 -:150FD500F3752DCA6A81BF017218DA61689FB1466D21DBA92DFB -:150FEA00039F2967ED5A15ACD57A56663C627272B07149A28F90 -:150FFF0046ADBEC62EC08F6923AC5FA3ACF3C8095A4C06CC398E -:151014005B8FD0F9173FA3AD5BEFA46DF397D2E7B62EA7CF1F57 -:151029005943DB2FAEA387E69FA6783FF357BFC8C198A6F8BFCB -:15103E00542F1C7993169CE9310F5CDC07F5C0BE554EB9CEDE5D -:1510530043BC85DAFAEA344C6FA1E5F712AFCF09130AB4D0C3DD -:15106800D3C06BAF2527C18D480BC37C89F6F12F9E621E6BA1D1 -:15107D00CBD64C01875AE093F9C4BB30D6C3704D312FD45EC9C3 -:15109200D405E99F3AC2884A995B13DF2FD855FCC78E2063D72D -:1510A70044DFC5AEBB64AD33EE92DF494812EAA2C23E336A0D67 -:1510BC0019F87D638EBBCF3C9433641C0A0D189DB0962F586F8B -:1510D100189E0F3E1777C9F825E280D561A81BA9897E90EF9079 -:1510E6000FCFF76E3A24E0CF440A2A3E49FD7B8D9D377E5E23CE -:1510FB00F7C7487A2F8D31947F01EC63F9B1DF97CF8BFD1DEE8E -:1511100023F65E382CEA18B97F0DCB5C073693FB1FB371BA04B5 -:151125004E43669F14F1F0A4CD6774129F5B27F091FBE5B0A8F2 -:15113A0087527CE2369FF5361F89D345651EEE67B171428E04DB -:15114F0095BABCFD7DA63FB4C83C06BAFA2277560560AFBA7A78 -:1511640043EA7B3E726FC56578F680FDCB0C3807E50E34C29EFD -:1511790055AD94F687550DBF8B04E9D8DB9027624A5DADF6326D -:15118E00DED9F9DCEADDB00F75B0D2D0BEAA0324DA48D43DD4DD -:1511A30055DA15762F851A4DFF0D5FA8FD86BB6C5B57691D3C31 -:1511B800A41DE0FE441F63B97D4DCBB46E8E79C51A053D12BD56 -:1511CD004C059A08276A94C281CBE3E4B9E527DDD5CEF965C6B7 -:1511E2004193DB34702E3E232D1D68B94B97844359F37D303FCA -:1511F700A4BDC8A186B0E747A79CAFFE23EE4D4BC2284B10C611 -:15120C0096419D11D43AC45D3427AD8D86F62B9EAB609E3B411A -:1512210039E96C74475AB90FF66017D6BB7A2FF744A2BC2032BB -:1512360022EE9C27FAF1B0EDC7D6043F4EFBEF689FA13AFCB79B -:15124B00106A85B48F821FE0FAA18FE6ED1F308BC92253EAB616 -:1512600044EA16EAAE76FAB35FEB608188BBD28DE768C2A807ED -:15127500D6A3E94EE2C5F7E7E7B61B259B89F7A5B93143D596FA -:15128A008AB5598FEB0073D9FAE876EC73578BFF21CABF23206C -:15129F0069AAAB3C61159E676A128F885E0BA4E4D620EECA880B -:1512B4005AB8CC6C752DDD9E6BC399CFDA9E1AC7FF6352430BCD -:1512C900BFE74ED10845BFE74B3DAFCBC0459C801EF81D11EF02 -:1512DE00CD0E6AEE3A96DE9BE4BDD916BCABB2EFA5314E08DEDD -:1512F300AFE9C75940AB2EC7B51570BD8F5DAFA95E29EEFB990A -:15130800BCE39FA37799F8BD016922CCA746CDB3C9A47F527EA9 -:15131D00B2F9D74EE2DF6EDF9D4B39EE127766BD71A4A3240E38 -:151332004BBA3A7E4790307C4E4C419FC571FF91F4D500F0620B -:1513470094E2BE68D3F4F9347FD50AADA02264E78D0AEDF66A05 -:15135C00A0C97C6A47FAEE1068B3A2ACF7F4B3CD8F8F1D355654 -:1513710068F757F8B4FBCB03DAA28AD47DEB0A6DBBA46DD35490 -:15138600BC8727D155DE9F19B638717B25D610F8EC4638D8F716 -:15139B00207ECF8950FC3E731ABFE72C4EB82B713D104791385F -:1513B000EC20E660C4D1FB38E2A0ACA501AC11A1B67B88903162 -:1513C5000236FE4BE255C5DD690CCF9BEA79D24FF15ED2F20E35 -:1513DA0088EF6B44AC7B4CE0FBD5D7E47730FBDC81304D1BA0C3 -:1513EF00E28CE280056D58A303B6CC8635E0D9B754F0E33B1C7E -:15140400E3E2FF0C865D648936C09D30DC971766C188CB4DCA55 -:1514190027C2583DF46A6488A910CBABB3C712CAF87016AC0146 -:15142E0060235930F7BF29E3A3593002B0771066AFF37F13F3E9 -:1514430084C1511569F6242F3203617CC0644C280C0F0C1AF656 -:15145800229960D0640871E2A297502C37025AEFB141264ADC60 -:15146D00E0A1CC4156D92DEE7CC144126CB07926122DDD9DB8D3 -:1514820099327844070F14B7425DEE8E73BD2D6A2B6559B7D497 -:151497009D52B355DE15578538BAE8B2559C73DFD7DD6FE6CDD5 -:1514AC006450F1F6EA7E4CBD37DDFDBEEFEBAFBFFEBEAFFBFBA7 -:1514C100BA31DE44D82DB80EE738919E4FBE9AF31B37FF6E8C0B -:1514D600D97D8E4A1BC19FE113CC3500EB7D15DAA8986B25E05C -:1514EB0087B471F62449D02133CEFDA473208FA0ED37A19F74B0 -:151500003663C7C458757D99E6E3144ABE9AA12F947C9BF50CD4 -:151515008CEBAB1D34234CD447180B4298111E57823AA4431D81 -:15152A006768C3D7CAB2AD92C6AD92463FE63CA91C16DF3FF7EC -:15153F00E1FF709CDAB90469291BFD5236446E9DE415D833C0CF -:151554000DBEEBAB6C10E61C105FC6F58DEC875B3ED5BCE799CF -:15156900AF3269B70EFEBE8AB2C2569792B0D97682E72DADE6FD -:15157E00717D5146D64D2F2B7296012DDCE704CDE492EFAB5527 -:15159300511E4ABE0134BEC1CA529CCF7E53D2C1CBC0E6F81BA9 -:1515A800C7A4FE495015BE293361DC608CF8337C825E8FF0D8F6 -:1515BD00B855A83D29D09E64DABF2DF80B65F06EEDC9F843208F -:1515D200770BC03B94FDC477DE271FD06EF709DE2FB9C6F8FCD9 -:1515E70009F8B2F5FBDAB2F576D9D305CA9475D3CB4A9C65796F -:1515FC00F1542EDF728EDAF3DFA91B7AF274033EA764DDD5BE7C -:15161100310B7C63D755E3F3FBD96FD1EE4ECD27B36CBD843CC7 -:1516260079CA9639785F78B6D748E4D5CF3A3766081863B4A142 -:15163B001CFCA948C92615F7A301D6853FCFEA38940F9C17769B -:15165000DD94B30E78E19670F8D301632C0F86CD032183A2CC22 -:15166500CC2F03787BED325FB6CC2C5036D39B5B867DEA73F4B0 -:15167A00D92EEB2D5056EC7596993451A9105621F9436214752A -:15168F0006CE4B1FC83CC6CA306EC2FFFBC7DACB1C6B51524A3A -:1516A400F89A13E5D7C7E5374E6D399F7910F72B13AC1DE6BA33 -:1516B9003F2474592118EA35C380BA700CDFB19DA53BD60968C7 -:1516CE001F501F6E475D02FFF1BB0315633A878FB2E223AC503C -:1516E300B9EA28A7CEF6E585CB5528EF92712E94FB7C7E617C84 -:1516F800B820BF7C85FB3AEB5CC21832C7A3072A123AD703DF1D -:15170D00866F7F4258D8CFAF1B037A2D747D6758B9E39A907AAE -:15172200DEB6FD421FE7F23A571F17A005BE11B48C51FE04D841 -:15173700D7233CF06F0AF2A1407B92699F4BDF1E87DCE1FC7519 -:15174C0079A7CF6FE29D3EBF8BBCD3E7322950B6DF337D7E97A8 -:1517610078A7CF6525AF0CDB3FE7FC36BB26E13ABB92CF716123 -:151776001B90A70B1DB60FE3E0DD72AF86386CA19A57A738EAD9 -:15178B007C79756E475D795E5DA9A36E812AED48204577F72309 -:1517A0005D268F1F667D8F380BDA7BE6DCDF88338C69E058640C -:1517B500FD8D98217C8BDCDC45A266737E547F75BBABAD8E9F57 -:1517CA0067C09C7AF516428A0E361AC9CFD31E5843EA53F054F3 -:1517DF00802798FB87FB643F03997A3EF6C77A726984BDD79F79 -:1517F4008DAFB70EFCFFFECEB7104F0DD0CA423DFAEA3B9555D3 -:1518090076EC09E339A4DB7C7312CFA274C7DE9CE2CF495CDB6C -:15181E00C033F9668A9F5101FFF25EB157E2F039A98B8C9F43E4 -:151833007E52807D39C4E339D2CEF6839D1D053B0BCFEF8FEA65 -:151848008277D59C77B6CD8D7D96F6106FAFCE3E93FC8BB8384D -:15185D00FF50FF35013C13CA3FBC53B903F1EDB957CC93DDF0B5 -:15187200447F12734E79CC08FEAFCFF137E36CCD771C7335E3A0 -:15188700FFA62CEC2BF024217992903C49489E249027C5B09E3B -:15189C00BE16FEE15CF26A4B0233B5BEC04BC58257A2EC562824 -:1518B1003B1018CB295B01654381E3765929969541D98D8149CF -:1518C6002CE3FBEE829F7A0AF8077C6C4D4DE7E3A53B89A721F4 -:1518DB00857CACBAE34FDD9FFE02F25024E5610FE03DDF9C4B45 -:1518F0006783423C473F853903B4BEF4E9745A5BE11BFA29D2CB -:151905005AF3AD69B5E391DF86DEED05E82D96F49E015A1B9ABF -:15191A00A7CBAF8939BE0564F7E38B694F11F4E3838BD3FB616C -:15192F00029CD317B11FBE6BEA47E63CEEB7EC4F5781FE28B23F -:151944003F5756114F17FCBE0BFEF73E813E69554CD56A18D73C -:15195900FDA0F35CCB09998472FCAF9056FA21BE0774AA017723 -:15196E00166886A56A2D2F22FE08E899B511DC0F8C51DC35426B -:151983009B98A262AD12DB0FB65831C11EF6F3FD2C0AEDCE4436 -:151998008E58A51DC7ACB512762F3CD3D79B74233C5DE2BFBBA6 -:1519AD00218F9E06D95687E746F0357D9AC04774810FF120BED8 -:1519C200E833B9F81640BBD28E23D65AC0F7E10501C327F17D8A -:1519D7007C41E083FF6E273F55C9CFA34D44D437919CFA39B6C6 -:1519EC00FE93F59756E6D6CF95F5DB65FD0779F5F364FD5A59A5 -:151A01007F9CD7A7A8EFD9ECF9A334F491913E1DF790DC68A32C -:151A1600F3CE1BF5833FC4F0CC47656C7333EE2F997D75959A13 -:151A2B0012D4A53E1BA838AF3787F6055B1DF1DCBD273B7E8D0B -:151A4000BC7ABCFBFDE680A3FCDC0BCF5CC1F2959B7FDDEC8CD9 -:151A5500FF9E7DEBA72F63F983FFF8AB665289B1C761DAFBDB56 -:151A6A00275A7C7E7373EC87C433761FF14CA3D391AF9B7A36C9 -:151A7F00D73E0B5F2365A10E7179C53A8C97A9B97DB3FD236C72 -:151A94003713647D3028721BB0ED40DBB83E33725F607F1BD7AA -:151AA900E5CCB47539D4719D0F3079591E3C5C6F52B02D5D5C15 -:151ABE0086ED35183306CD2A1DF7BDC16FF4F457C4F4BBC89216 -:151AD300A0972CA99BAFB98298233650C1F4756655F0BD0C5F2F -:151AE800C6F83EC46CCE0FB6177D9412F0F546F3EA3D8E7A059E -:151AFD00EA7BB37CED2F5248BF1BEA5DB5307EB2CD7C6ECFC40A -:151B1200B7D741FB8DB2FDF740FFFBB592805DE787BA0622E42F -:151B270009FF2F3C3B6254C3FFF98E360BCFC60D5F1E3DF7C0A8 -:151B3C0038252271CB0DBAB6FECBB4277625EDD9FA557A96EC0C -:151B5100DFAA49D0D3203F397AC527E574B491F079134A3E4B1F -:151B660093256416CA19FAC136EC27619E610C4775D0E5AA8842 -:151B7B0019C723DCFED2808C3FEF01B8D5C0FFDE45C493AA12E9 -:151B9000B27FB20160CB7D72226DF99364980E4E8EEA336F4273 -:151BA5009B1EA0C297D5E43E6D35C576459EB8F1AF8B7E50EF22 -:151BBA006B8CB1062BEB6F45E0BD669090283C1B9E23C484E70C -:151BCF0065F895C3FB65F885E0C79E13FB5D08A7F53FD29ED399 -:151BE400B82693FFDDE7D39EE3F89F8DB079303E181BA8E47B6F -:151BF9000929EBF4FD843C87B6818D58367FED75C669919FC22E -:151C0E0061281AC6285EC77C7A9ABA8F102FEA228C9B711FF33D -:151C230088E56AA306EE2763EC8AE7CAAB23B8B75AD6E4A0E3B9 -:151C3800AC9BCCC2D82AE2C7734FB857B100EAC73CD25E713CCB -:151C4D000798CA7535A326FC5FF05F609F501F89FC8B0C2D99AC -:151C6200B39958F63B570AF0F17D3CC5F18E7B97F63BEE59F2DD -:151C7700B80FFC1F73C4B96C783E76C4405D904A5FCFE71EC6BA -:151C8C004486FEF9282F23A9EB89EFDD51F10E7F701CB36D6341 -:151CA10016C65186268FEA650ADF43B1447C2566613CA5C94103 -:151CB600B7D8BF1CA60F4C3D30B5787234472E67A35C227D20D4 -:151CCB009BBB6F271E1EAF0C1F61E8F7EDD7560510861B73A2DD -:151CE00022A798163941FDFC9CD3179697E700279862EF075FF5 -:151CF50014F916FC5C82DAC3F74C791C397CCC7A5CCEC76BF51C -:151D0A00279B1CFCFA661A246E3CAB84F80BCC81F25560EBE5AC -:151D1F00FC60B8F7AC522E5764B288801D328662CA263C7B40E5 -:151D3400EFE5716FBFBD6E9B43460CD46BC85B2AE9C3EFCFDEF8 -:151D4900463CCAD45386FAFE53BA5347E2792466821EE76BBC5A -:151D5E007E9AFEBBD30AC626152EFBA6581F4D017FCCB87E3379 -:151D7300190DE299C5D496A3CDCE71B94EEA8BEE159C0779F150 -:151D8800175CBFD9704D0E374D4ED2CC99447594611CED7B66CF -:151D9D00BC20EC191276F90A92B38F9B858F79A4FD745FC5B0E0 -:151DB200CECFC7838E45FA63FCEC42DC5C8CEB03C0519C1C3729 -:151DC70095E409D35D1A37704F7026E09B1B66862B42E9A1A492 -:151DDC00B249D17AE90DEA2F8D33E9B4DF1B5382D9757098A279 -:151DF1005FBBDB85BAB015CAAAF9790D9EAE8B3EC3FD620D515C -:151E06008ECFCA06983B77BFC8D75A01ED4D727F017AC13E46AC -:151E1B000EA37D1CE6F6715FC549DD3BD9773BC737A5F4B2C6FC -:151E300031417B386E7AD1DF93E54591B8A9362678FF0E9103BC -:151E4500BA05F2EA5E07F38DC5AD9BC51955E68A8C67FA3737FD -:151E5A00341AB4BF15FA2AF33E8D9EF70E67F371F7817FE13540 -:151E6F00253DEC2AF440B90AFA176971E2748978EADE9C3334E2 -:151E8400A82741C648E549B18F20FD33E09DE08FC82DC8E5A33C -:151E9900DAF762CE7E3DCCBDC806EC036BC7791A4A1EDE5B29A3 -:151EAE00D681E683503E188EE96EAFD86B4B024DE78B4D3CA3AA -:151EC3003E0BEB03EB458E0CDAB0C572EDD8CA6564CCAC833ABB -:151ED8009B764E37B46F58CFFD6C1EC75F2BDB353ADAB5245FE1 -:151EED00DD0B3F13CBA3EB798CC4C43831F605D7AA48C7E05399 -:151F020071DD3729F704A1DCC6DB25E1FD5501BCBB1D78B7CB1C -:151F1700763F71B4BB0BF0623BD3D12E2ADBF514A0EFAEE41B6C -:151F2C0026CEB17E4EE3DF9B685FDC408B0AF43DCF65679CEF03 -:151F4100430FFE13D04AC4397EB783D66E097BA000ADCC41C374 -:151F56006ED9EE50015A871DEDF6C8762F7C0DAD38C636ADA5E6 -:151F6B00DF406BA983D6A484DDB1613AAD5D1BB2347C2CDB6D89 -:151F8000DB7095F1DC901D4FE52AE3A938F09EB7C7B300DEDD56 -:151F95000EBC17ECF1BC0ADED68D38BF2690074C75E2C5FECA8E -:151FAA00FB36B0DC96F935D0FE308967647E638990F92B2E21E2 -:151FBF00F3A18D59DCE11281BB65E3D7E006BC3E89D7C6E77309 -:151FD400F473A384D1561806C3396BEF7597E7EB3CD02FC75F90 -:151FE900CAEA3B3E9FF95D0A4719B767784F8E7A9CA11FE92EF7 -:151FFE00ED33F6815FAA826D53D79E32CAE909E32021739C3A1C -:15201300E86FA05F85748FFD9DDF15D70F9BE33ACA8B88271E8C -:15202800D0613DBC17D7BF77715859DBB01C6015815DC8E8D5B4 -:15203D00D0B8EE5E17E73A95EB53DB5E98A84FE35C9FAA6D40B2 -:152052003FE85197E33DA7BF9598AF31ACBB2A9881E7F178AE2F -:152067008CB0F9D23625047E26F5697848F8946063455F46F90A -:15207C00F9097E3E08ED52641CECD23B863B7682A26D2A684F28 -:152091005ECEAE1F193FC7D46BF8319C8E7B15F2FFA5747A5E1E -:1520A600FE5A52EC77F278BD359C02FDEA81B915AEA12CD41386 -:1520BB00455DEC2E163A59917E7C293CA37F486772FF588AE7B0 -:1520D000E79539F3C6944671EF4CABA31D5EF893DF0E6DC2F3A4 -:1520E5001A9E5B3AC910CE83987F510BFF8167E877BB2A13EDD1 -:1520FA00587F4368D4B821F40ECA8CD5CC7345C618C2C372FF1D -:15210F00E6B895FDFF8EC1CBFE3A8E3E0BF1B38421BE7F076D69 -:15212400BAAFC8DB631CFF324BD3608AFB4D0E9A12B4991C5B1C -:15213900E9D75C011B37DEBDC3F34230FF1ADAFB6FFCC2CABCBE -:15214E00AFFA228327B9F058535126EF07D6AB320F1BE92ABB9B -:15216300310E7EFE10B3F819D31A3A07F87D3BB24315B044DB21 -:152178003186FC07B368A9EAD330D6C7E19B414BD18E5BED0E8D -:15218D00BF12D6DDE411AD64E5844BAE8B0BE05983BE4B41D8DD -:1521A200555689FA16C09EA0840D594AEC94856704C4797E691E -:1521B700BB51BF15CBF98B396DF25C0091759305FD19915B88C8 -:1521CC0072746106D29560ED226798B9257D6E271D682B8B05AC -:1521E1005C7F30415522CF2AA8C72CA443FD6889C56D51868E26 -:1521F60014ED8A65E51BE11CBD4FC0194C09F8026E82F3A7EC3D -:15220B00A33EE68235223F8347C6753C138F3EB0F82661619B93 -:152220009C7900F03F8C65FD1FBBDF083F719FE89FC0339683D4 -:15223500C7DE73C0B69C8F49C1C71B36F75AFE7082D7259C38A8 -:15224A0033E7914354D0D24055CE975679875080BA653E202FCF -:15225F000F8FB28717A1EFFA0ACF4773D2E07B7909738E1DB4DE -:15227400B114F508C6FE992D27E80BE30D65CF935E9DDFD31477 -:15228900A69C2FFCAC05D42BD05FD660525C841797F61AECC022 -:15229E00ADC607FF96F690A911BEBEF7E118A96F1A8A768AF9BB -:1522B30023E24E017B0D535E3C7D1DD5D37624735E3EB39E9A77 -:1522C8003A66DD7EADEBA9F06B962D539847365C22D6BDB93243 -:1522DD002564086919967CE163128C7179E2EB5958C7A33D4393 -:1522F200794219E0BC32C51AFEA5AF44AE52A1F504CF1B0EC06E -:15230700DC6717E83C7FA01DF767BCDA92FAF7D19EC23AFC1118 -:15231C00EDD6E0659893CB93BE55DC36DE2FF37DEEC74B4F0E1C -:1523310070B9E3F960A2DCC2F2F7E4FA3622DB46F3DACA720B9E -:15234600CBEDF3B836FC5EF9CD60DE37B2DCC2F22E09BF5FB607 -:15235B008DE5B595E51696DBEBD4C512FE6AD916DBE1FB028718 -:15237000BE6975D4E13B9E6DC2334D6E90A362B0558A36622134 -:15238500BF1475BF81E31DD046F19EA9B9734343CD0AAC57CB16 -:15239A007A2E18A5DA116BBEF94993BFE55343891CB75E8E95C9 -:1523AF006C72C39A0BECF1BC9991192B95C805CB96D999A0DB1C -:1523C4009257709F2E3B077E0A3652E1E746D8B4F928E757464D -:1523D900AF200CF5E08831583CAA236D73375759F67CE632C014 -:1523EE00CFE58EF3BB8BF8592FA147ACFCF92CF2400127CC19EB -:15240300E73C796A76AF91F8ADD84754A54EFBA679F27480DF1E -:152418008D23E6C8C008CF89518BB3F98F8B31F7007C8D07F85F -:15242D00DE7E36AEB50EE4CD67CBCDFF36BEE9984FAD45FF072C -:152442003A3ACF9F086B23ACC4DBC7F9F912C06BFAD4E10B5CB6 -:15245700CCB3BB400BB611FB20A6C5F7472AC7DA4B0EC68D21C8 -:15246C009015B5294E93220662B9C57E29BF37096D33D66BB0B8 -:152481006E4FA17D97F0307EAB4716B1622FDE75D743272F66C3 -:1524960071AB05FC107704F0F23D0AD3C2F11A02BBAF4E8CD0AA -:1524AB00CB12278E6F0E4EA877E7E1CCED7F75FB4607FE900352 -:1524C000BF5600BFE2C0BFA000FEAA6BC48FFE456F6380DAB4A9 -:1524D500200D139F081A1600AE7CFCEAC4118E4B8B8CC0DA3C30 -:1524EA00D10E6B6F0B7D1F45E377CACC5B101961CF83DF833679 -:1524FF00ED92D3CFC1589F5A65F5B65103EF74BBF46455338FA4 -:152514002756DFB4B4AA6D6B50FB6143E366ED9EBF587FB7B6A6 -:15252900E127BBBA3B1FDDA5ADEFDCDED9B1AB33A8B56CB9679D -:15253E00C7CECE8D5D3B7EFCA3AEEE2DF5CB6E5B16D0AA1FD909 -:15255300D5B56DE7CE1D8F6DE978BC235457D75877DBD23F5BD6 -:15256800AE3DBC6D7BE72E2DD0585BD750DB7807BC04EB03C11A -:15257D00FADBB4AA4CFCCCC6575BBBB533BAA3BBF6A11D8F4646 -:152592006B3BB67644773D51FB68C7B6C76A77ED7CA8B6735700 -:1525A700B4F6E1276A3B3AB6F3B2ED3B764497EDBAA96E857601 -:1525BC00ABD6B9755BB7B6B5F3E18E1F6FEFD61EEAEA78EC478C -:1525D1009D5AF5EEEECEDDDD4B11CBB783BF75E7B6C73B77D624 -:1525E6003E0CDDDAD2D1FDE896AD3B1F5FF6D04D2B1AAE063F10 -:1525FB00039E9F6799E30FB7EFC77D42B58ACEF537B4576BF5C9 -:152610006C199EE5B1F3F423CACA85FA05E350E870B4880CD334 -:15262500F63FA63379FAEDDABDD67FFECEB552517F6054692D59 -:15263A00B40AE6DE39D0253E78BE85BA539ECBEEFA22ED797785 -:15264F009112DCA81D613550379F8C3787B401C6EBC3CAD30165 -:1526640028437DD3E428C3762AD8408069F56BA5AB6C9B500E21 -:15267900BA710611BE04FEBF02B0F7A9CF44D14F1CFE657A16F7 -:15268E00D2E5CC6B77E6B4C72E8B585C1F6F5F4DBBA03D513FA2 -:1526A300B77CF0CD04E68D39F0B328E1676797B9C85CA40FE9F8 -:1526B800F069C718F66106AC53317F8E4C2DC538ACCFDF72AB4E -:1526CD00817DC77B164BFEA1D1C02B54AA0096D8AF3A44C3DAC6 -:1526E2000BB4FE6DC00DFE940FBEB7F1E0391EBCB301CA2C2721 -:1526F700CE35E934C7C9EF6D04FFEA783A3DA732E2127B6AE153 -:15270C00017A1DD80584997C0BF3660350F60AA7AB04ECE521AB -:152721007E6FC47EDC972BB3C7CD3E6311FB038EDDE77CEC30F5 -:152736007EA36930EFD4BE845B5B6195B41C85F13EC061E33C5F -:15274B00C43958AABD6CD57CE56ACAFAAB620C6C7E3BC7C1F730 -:152760004EDAFD75F5574EA66739C703E951811E9F63BCA211D6 -:15277500378D257F65A920875A722431D7BF1BDA76515F7211DD -:15278A009B9D2CDEB43AB914E435DA8E776AE01D89782F0E0997 -:15279F00DF4DDF55709DA453F465947F79D0C07B36D662FC4621 -:1527B400C533BB61EE8B0E9ACBF5D74275ABD66845ABDE2F396E -:1527C9004FFDA15BF83E63EFEBE959975C765ED6009B9133FE04 -:1527DE006B29DE5D89EDDAA1DD19D92E906C01B8ADD66A11DF97 -:1527F30048F03B29E5B326B2860EF0BC9145D485F77F014FC4CC -:152808009D94B9CFBD2E71278EB8E76B047CE95AFD52B180EFB5 -:15281D00A523C603DAECE05C6D76DDEB8BCA82D6E21B83A7B1E3 -:152832000EE3BAE3E9598B355790D3A90E50DC8376C3BC3C0DA3 -:15284700F320137F9B7A45D8E7A957AC9F5754EB7CBF1874E630 -:15285C00A0840FDFF3BDD47E8065B7B5DB6D873607DBF0BEB4B9 -:1528710012DE07DCDFCDC7A57F21E6512B7CCFE358324E77F2F6 -:1528860028C233D982D251C3F7DF87190A4E6B12CF389FE7E720 -:15289B00A9ACD0ABFA10C09D5F5A632C07BEE2D9D81A729EF631 -:1528B00086DE88624C2D896B83B6A5860563751DC84EC99E710C -:1528C5008AB90441DCFF507F21C646CE65F4A915BE2ED380AECD -:1528DA00503BA75FFD85357129ED395A24FA79178C75538131D3 -:1528EF00857575597E9F7A2FA5790E09C2D92EBF9F0F73AE6456 -:15290400CA34F0BEBA2258A784928729FD4DDA637F8B730575F3 -:15291900E284E43BC66F911701E083DD6618EAF83B7B864652D2 -:15292E006911EF8436A54773798F325888569CC7E5C91EE6FB92 -:152943004CF0FC83BFCDFD6E02F98F72CE75C37E6AF37A1078EE -:15295800DD9A1CB1265E933E80B3DFB83724FB4D7F2FFA8D63CC -:15296D008FF0A200AF468E1997CD51219B788ED6D576B71186B2 -:15298200FA9B6DF9936321F89885D1F07B416B1464E2E3D78499 -:152997004CCC2FAD37FC23AEA02D1B78CC3B2AE2B952364EE849 -:1529AC00E8DF2D262756A15CF81A135C1E2C73B1EE1E386228C5 -:1529C100A073174B3910FB02B9E37E12F8EC575F0199EFA15EF8 -:1529D600900B5F4F9D91BA28F96DCF07C737181B2FC4EF6538A7 -:1529EB00DFA13DE7793E1E984F9837649F7FB9CE211BDD201B4B -:152A0000D13342365C781796940DCC8343DEF01C07CCEB782D44 -:152A15003B7E086F76B8CBD0FFFD2FEB41C759D5C936AB2AD9BA -:152A2A0062819EB3400FB202F909FC5E665CEF946A553CC61AE4 -:152A3F002BB00F06FA9BCEF00E1891728C1B8DB5A3DFE6F28C47 -:152A540018B89FA6CB73D6E8833FC0F79712FCAC18DFFF8275A5 -:152A69003B9E0FFB79C54958ABC6F95E981AEBB3300F7275EC6C -:152A7E0014F7FFCC581C65729EAAF559ABB553168367191B3372 -:152A93004E6BA29E2C8AD38FAFE21FBAC984E723A5B9F8B1A2B3 -:152AA800CF5D3F73FD4F7B4F1B1DC575DD9BD5AC342B0D627676 -:152ABD00D95D495848232C12C9519C5DB1C8922CC242A88FEC13 -:152AD20010654B9D744612F63AB603B19D84B634C7E784C42B00 -:152AE7005889058FF03015F65A266695480E6E209539909014D9 -:152AFC0092A5761C9152B2E1381C9AA4F638716C9AB8B6EC6293 -:152B110087A436DB7BEFCCAC56027F25ED39FDD13367CECCFB72 -:152B2600BEEFDEF7EEBBEFBDFBEEBB95BB86F37317D82FD98F5D -:152B3B00D9F7D9636C823DC40CB69D6D619BD917D84676275BBC -:152B5000CF6E6537B33EA6B04FB0B5ECE3EC63ECA3AC9B5DC784 -:152B650056B3556C255BC196C38CB29375B076D6C696B1085B45 -:152B7A00CA5A599885D887D8D5EC83AC059E0FB0AB58333C4D64 -:152B8F00ECFDF0BC8F2D81A7119E2BE1590C4F033C323CF5F4B3 -:152BA400D4C1B3889E5A7AAEA067A1FDD4D0536D3F558527687B -:152BB9003F81C2E32F7A16143DBE598F77CE235DF2CCBFE4A91D -:152BCE00BCEC33EF2D1FF16D9F8A777CCADFF5E379C747C0C3D7 -:152BE300535AF6BB963D6099CEB280EC52D7DE1F63F241F46BAC -:152BF800043FDDFE6F82FF9CFDDF02FF1207FFC863EA9A207EDC -:152C0D0054D359B7968349B2C4299A242F3E28C5E1CDC06B2E5B -:152C22003E487602C97E6C13D9BE9365DBCF63FB71E017B7FD26 -:152C3700CA6D3F17F8656CBF0ADBAF04FC303F2893CE264A2C4B -:152C4C0016B2F342BDE2909D07EA1187ECB4A8371C8234310E91 -:152C6100F768656DE3B751D0BA4A83D9F6A81BE41AF48BD1B952 -:152C7600FFB0EECB70ADC25433F081865161AA83EC1B26DE2674 -:152C8B006CF26DC2C81E0B84554218F81BE8CF9FE850A9EC5CF1 -:152CA000B3E1E0CEC139D62367C3983B4234D1659A8787749C89 -:152CB500F731AC27A509F5237E118792CB8A3F99B5C3813776CE -:152CCA00C98B0DDDC9E7B8E51F837831E49BD262831740067A12 -:152CDF008B6F8C9B89932BFA975C33FFBAED4FF8CFE6E7A36DBF -:152CF40009EB3CB7AC4D93FD5BD9D2E720DD4999743D4AED7F28 -:152D09003A37EB82B686F66043EDC03B5D2CE96A37CA609ECA75 -:152D1E00473BD4E9860E5A9F9BFEBE7B19E204DDB8469A857495 -:152D3300226B471D6CA30570018C5613E456A38C5D05B05F65E1 -:152D4800B883D1FEDC65FC24CEF263F2AB06F2DAA6B96B14217A -:152D5D0059273F6CDFF0BD49E65A79A099941868E571BE2C35E6 -:152D7200A03D4A18CFC35064BBDE42EB5061834908974CB0C425 -:152D87005CD55046B38EE5F353D5AA94688EE0574834B7E23778 -:152D9C008675CD8548A6C6B8D48ED15E6528A425A84FB46B511B -:152DB100D26D8AA27F3C3FBF1BE2C4C88E24CAD0D659D8B8163F -:152DC600A573001BAC33B1A18D961E14BBDBBE272065EB48E02C -:152DDB003AEF7C002A09F397A4AEB3A482FB3DE87E7505BF8CF3 -:152DF000E5B6E8A2CCB7B2D856FD3CD62B27EB96DD5C4B6FAAC7 -:152E0500C52C69A53C213F5A57C2FFD8889EAA49281CD9F31C8E -:152E1A00310A7A20B11FA4B17EB5F2FD3A2F9F30989E84791408 -:152E2F00BFEC9B377F13F27F328DFEE8D7027EA373FCAAC16F26 -:152E4400688EDFA6150097F47CFA7337BF1006815913E5A7F5FB -:152E5900BBD99456BBF205B5B7FE99F043EDE7ECB316093A3FF3 -:152E6E00BC287106EF0EA075B3452B4FA97C665C77C1B828CBA6 -:152E8300DF4A33FDBC21A44668AE836B6D4276775B10E7515087 -:152E98000ED3BF615CC1BDA0221ECAD933E1C99B5F6A031880EB -:152EAD00A64F035CA7744EDBA93EB4EE79ED8AA806ED68A70154 -:152EC200384B5C5CB13A2C6C87F2625B27D9BE52B42D3E2908A7 -:152ED70068EB74DBA8D0FD02F83F306AB9BF6EBBBF3D3A95CFC1 -:152EEC00073217E75CF311FB693AE99AD2116F77B3AC96F85E05 -:152F010069EB97BF5CDA8AFA10A3B9879485A71F504A4E3DA5BB -:152F16005EC7CE8417668FA964672DA4DB76067354D780F4F77E -:152F2B00EAF95B9E3616724F42F81943481C68C3392CE63D7D7E -:152F4000CB295DC894B61EBAA77419CA26C447A4B18349570694 -:152F5500E87C58C7BAFC61EF6024781CF2967EAD617D24843B52 -:152F6A00F6F8A4807B23D2B68312C1FFC383CF431F2C978753B1 -:152F7F0068DBBA4C1E4CEC4A680AD7A3411FFDA98E3657E38FD5 -:152F940031769F80FB095A6ABAE13503E2EE78496E591683F8DE -:152FA9009BE3AB5B518EA1BE251DD0F9CC578047BA5BE3D9FD8E -:152FBE00AD4C3FAC4F63DB8370EC3F6BC19FCF1C80F63348B612 -:152FD300299A6CDB31D4D7F461B20BDF44FD0C64DBCC30F4B3E3 -:152FE80084C6036D25A645F02B30AD15BFB85F266476431E596D -:152FFD00B2C55A9D49EA9C00380A65C9862AB643EC1FFBA6308D -:153012006CDC88A1CC9D491A572534F2CF803FBA512E9C6ED029 -:153027007431CEB77A4176C47E32DD306E2C0C66FA8F5E742F22 -:15303C00035C1A536FE40509E0E98232CE60BF0AA5B52CF0E088 -:153051002EC89765F6184F15CEF7A47411301002E09E1FD42243 -:153066004C3F9EA67929F0B3EDD153CAE9DB4B5BD36C504927FD -:15307B00762B171BF965E9E8B052951C51776DD5945D1D6749C3 -:15309000B694CCFBD39D4BEAAEA13DA3506212D762BD8B92B8B7 -:1530A50027A8D766A84ED69AB680F67513B466DDCEA32CFDBCA3 -:1530BA00CE75A38EE113C6AEACA6E07AA190D903E9B6219E69A5 -:1530CF006FAFDABCDFA8351F369A0037B550D75C298805108ECA -:1530E400FDB349DE46B63C280F49439B4E42B57C9F4E36F7D6B9 -:1530F900691AA4D39137F0F1437AC4FC1EC4DD66A00D4E616AB7 -:15310E008F8A79BA4E4E908E5AEC71C66A70BF3F74846C05F0F8 -:153123003D432AD469D4D5B3534D95B1D9FD23876BFB29ED8BE7 -:15313800FFC6FFF0618EE8427B1E7EF311D203A45B7670CD1FF4 -:15314D00FD5892F4B5B0CED6FE478AF63F8CEC88526D0EA543D0 -:15316200E6231969A5A60AD76B6AC91A4DE565CD1005DCD3DEE3 -:15317700A3354577B7E1B9B1C000B41F98B75627D07DD808DA47 -:15318C006E3CD36EF1FDDD86DF145BD18FEC8D16F643D2B4E610 -:1531A100EF42DCE446F446A28375C69963FB34D4CBB6CE365B69 -:1531B6007720FC02F2E2D6A0CE5E86E8C7A50EA8C14583C60317 -:1531CB0051EB5C2CAE9DBB7A2CDBCB3716D921E03EAA912D62AA -:1531E0000969AB7FED20D93284FAE33A346F022FCB9D277C7B31 -:1531F5004DBE57A4B9439AF6195CA46B6ADDB101F35C03ED4235 -:15320A0021BC9CF945ADC95C102EE6F1C8DB918EC4DF0BBC1DC8 -:15321F00F8FC86D25EBFF9BA4176DBFE11DBE190B1E5CD7CA012 -:15323400E54DECBB162D10D77E73A7EED246546FA7B5D7EF02FD -:153249001E81F7CB886C64A9086D65211B09231DB5A236AA591F -:15325E00F4D2D3A4F375AE9FDA18D00FDD3CB3F45F5336DD9182 -:15327300CE9806DD48D7B934251AD8F478271CBF5B5AFD4FD299 -:15328800A29C6891B6F7796668F28EB4281A6B1D3AE8DF477B45 -:15329D005995A1629AF8E2EF0F93DDEDD8C0E4857BDEDF26C538 -:1532B200CB605C1DD0D1B636F2AECD5F2C6D9DFA2F871F59FCB0 -:1532C700A31A68E65BA4191CF04DA421D6D5DAF3B1CAC0F230DC -:1532DC00EFC2B9A882BC64D1A5A688269B099E94657705C27175 -:1532F1005F5132771A9C9CA4F6846EA5C8BE40A4287DE4930561 -:153306007D5FD2134EB309D2DB6C42DA0F4C28A2EC26DE1C225F -:15331B003D404DAF895ABCA8D00FA1CEDC061C8FE17BFD29C2BE -:1533300001F45B7FEA0F567DCD39D76CA18DFBEA60AABF06645E -:153345000199650E8658F660949907AB7F9BF7C07712DC93E0AA -:15335A003FD96DA77FABF8CAB9D9F1ABEDF838AEEF7FBDA84C2E -:15336F00D4C780F947715AB2CF45771668FAC57BF8655DB87E3E -:153384002E1F4DDC37754C2985E9062F8FA4D04E49B9FC448ADD -:15339900EC86D37E5096CE544AF22198B72475D15CD27AE3FDB6 -:1533AE00790FE2417B30EF999B67316CA4770869BBE407F5F373 -:1533C300CF6A2023E96403C56A877F6750DBB56CAD4CEF0279DE -:1533D800B115E4A2F7D236A79F1DD193AE94CEF6F1BDD3CF6A0E -:1533ED0046D29536BAE45DC6EB17B17F24ECB9C980F11CCA42CA -:15340200407FDC5F95A18C629C5C787A363E717FD796672D5DEB -:15341700687D8F8EB23307FD0BEB086E63F5DF82BC188A914D54 -:15342C0074279FEC8F67F2697C2D2FD4E2D9A16035C8F103FAC1 -:153441004928F36E16D798194AE3BA986836E9A5C7C3EAB7121E -:15345600CDE1C1F6F659B26519C375E276EAF765DCADC067AE49 -:15346B00D765339666D22B862034A8B8D66CC9958BDBCA61EE8B -:15348000E2AA53A80CB4878769DC0361B5321A8E944399FBEB54 -:15349500AF6DAB3565181B9BF46A33A47362A73AF895B0E6CE17 -:1534AA00C23C31D76E387788A0EE07B374D041DE6C0CF3B8563E -:1534BF001DFBD424D36F191552B87FF857F43557B896CDACFF5A -:1534D40057DB7A174D363F0B013F6B5750AEF7C95C88E62A504F -:1534E9000FDEB11D937B64B226BB47ADB1EF6FF0C3388DE3317F -:1534FE00CB7DC7F072CFA9AD0D95D7B0BAA97EC6CE6912FB759A -:153513009B9F7B59DD29BB5B51560C01AFACE526D440F048BF54 -:1535280010FDF5D25AF8BA4EED26BBF4C827AB56A26EC011FBD2 -:15353D00BEA1843605E3BE2F7158F5D682DC52B0CFFCCE6F157A -:15355200C8E6F84DAF288BF8E2653067F98ECECC470E8E83CCE6 -:15356700556BDEAF23EFC276817BD85E18AF9FAA19591A05598C -:15357C0007C7A14FB875926FFEE9412DECC8346FBC997F4B99EA -:1535910026FDFBFC5BCA34ED6F25D3C45ED04CE77C39F21CC0B6 -:1535A60095D0707B5B39E93423DE8EB5F98FFF07E47F4C5B0B28 -:1535BB00B87BA05D776C76109E828943053C05CD2561E11CEEF2 -:1535D000296D99E44F1C437E1D5C68CE0B835BF79901FA969B53 -:1535E5008BE8AB035FBF5CFD619C8DB8BA5F564F5EC80B880779 -:1535FA00AC6B8B5D7766D7BDF63275C734E90BEFBDFE8B80EE1D -:15360F00D5C85763BBD2B1D7E7CC6FA08E747744113D5B8AE3A5 -:15362400C476EB37B0B47623C8F0CF3F35B254968F4F0297D654 -:153639007C1C8CB7D219C36FB74B1EF505A49F1B77B3B39A97FE -:15364E007B91EE4FB862E5CB6A28FBBDC8151D163EAF602F502E -:15366300DBC3FE7A05CE67426709A7D8E6703D17D784EB4C771E -:15367800AB13A7EAF8D305BC57415A491E48272A92BD18F72EE4 -:15368D005CB28D1D4AA32E4AC9D4310C1B759D3CA6EA799847E0 -:1536A2004178937C7B1B7E119EF32BCA966DBAF91990177FAEFD -:1536B7000BF263A32DF2BF1AD5E7ED3AC6862645D437CBACD512 -:1536CC00AC7F9C4B0D4D9E5B61A53F0278F3DB795D58B1BEED6D -:1536E1006AF6F5569A0B15C5C5B49847713AB4F7BEE5DE334AFE -:1536F60048FECBA5E88FE32588D21FC7FF0771CC8C0D65503E7B -:15370B00C5B4E5A8630FB8C4F361B5BBBE4A785D28838C60E796 -:153720005F39EBBF2AECB2FED3E5F2FC307C7557A525B763FE8C -:15373500AE8777A83437FA21F00A90BB8CE8238A144DAAD5302F -:15374A0096D079BD7761A31F5F1863525C6AAD8AFB984CDA4A08 -:15375F00E3901480F1C41E87684CC2B0F7301E3963913D2E5D94 -:15377400763CC2B108C7A408D9F4288C291A3B618D29563932C9 -:15378900AB965F3116A06C01E394206F37BA5FCD0BE5192D5589 -:15379E000E7047A2C956677E580DE31AC6697AD5A1F7A05EDB5A -:1537B3006ACD2B733FA0701DC343801F4CCF32CFE97417484EF5 -:1537C8008379654A2BCD24133E2847CA1C4A639F2B318F699847 -:1537DD0027B6356C734DF2B3A3D8A6CEBEE1C86B36CC00EBA1A5 -:1537F2005D5F813E3CA0D37959B439FA5D6B5CDDF3CA4CFFF2E4 -:1538070006ADF32F82BD5F3659C53C208B7AF62DB0DC719E794D -:15381C0036BB98670A5E4BCE6EB27993A523E2C6BB03FCCE58AA -:1538310098D136039EFCC73BD45520CFBA07C6D491DC98522753 -:15384600BB3B17CA1FFC30AE9D511AA9592D9C178D3540BBE016 -:15385B0086F87883EE96701D8E1B7A716F73849D1FD0CC1378F1 -:15387000B9D15C797276F9AB12CD4BFFA4722ED1BF09F53756D0 -:15388500B10A495AACA2BE2DEE75476A58855BFA06E9475E9528 -:15389A0079B30B75A7825F0AA3AC4B3A51645F00CFE5423CA71A -:1538AF003CF4EF02F78CCD6E9AEB94E3BEF81341B47DD3D4FF48 -:1538C4004610F36D253D9F5C35AB10E363C05797A8EF93B98E87 -:1538D90052482FC61B8C0BE0CF7F6940B7F412F921679DC02DFA -:1538EE006D517F0161685F6F04E340BD704F4F46DD29F0E3E3FC -:1539030063C651F487FF17618E7ED64E877B5BCF813F7EC78161 -:15391800C6783EF0A8CB3A53398234F74FA31D4656B60FEDE209 -:15392D00BDAC49A71F5450AFB51AE737D2214D100FA83D40DB6E -:153942000532DF5B66EE21BB48B5C00B8326C61FDEC26D1FA1AC -:15395700FBE170AE7355A66BA9245A672FD0F6C97CCA736254CD -:15396C0080388215C75F9DE19772FB2E4DCB6265A4EFAA03DE24 -:153981002201EB4C23EAB7A0DD41DCCF37C18F49C9C2FE1A2F08 -:153996009F37EE02BAF1801711FA66BCCABEA3720E7D437141CA -:1539AB008B9B3F3CC83F3DA0BEE177F2AD2DE49BB2F38DDBB65E -:1539C000677700AF385A86B695E47E964B18B4FE2E4534AEAEF2 -:1539D500BD9F379B0CC1443FA095D94EE5579BD306CA4392991B -:1539EA00813CE3FDB82EB9A3668342BCAA6E637FAD8967CCCFD0 -:1539FF00F6F3F2678DA341AB7D34429A263337DA02E923905F61 -:153A1400D702E609417A0BB63F4B236C68A77415CAA076FB725B -:153A2900D545FBA3E6EF8C1D3531254A792AFD317043FC83ABCF -:153A3E00E11B87BC4B614E70A3B9D7889A0FA4BB4D7D34065FA4 -:153A5300DCD38BC17F16C215282BE7B36DF1B20CE1009015D890 -:153A6800519351FACD8C711BE41B07D8FCD85E01572DF015E0BB -:153A7D008B362E6508AF85FFD590871FBE8D3077DB00FFE716D1 -:153A920060DB065C815F37F8F1C06F9E02BF50D0A2477C8E4D94 -:153AA7005FF7D30915DA5D854FE6979714D18B4378E47103D74A -:153ABC00A042F2B826E0FFE5F4E5E83C48448BB958C5D5995BCC -:153AD10022D86F4A3B642D4B3A81CD7A359E6991068C52DA2366 -:153AE600E6869C3C3250667D7A8CCE0570350975C67E4B14E2A1 -:153AFB00453406F90D215EFC4D05DEA69CC231AD5945BBE28BDE -:153B1000E5DEA56CD32B8353CF32E6E4C3360D68999FD8FB05AF -:153B25009BC63413FE51074328C0D3A12FC47105C39EB5F48CEF -:153B3A005B1CFE047ED99FA0AEDEB2E502C00A3207C1EDD09B26 -:153B4F00492097DBE9826CF972B6A983F277F46D310DE45551D0 -:153B6400C9BA280CF32A0B5E8A2FECDF7E6E461F5EC2BB96FCCD -:153B7900FB0A75ECFA31D6F1807A030C0DD29726F4F88F11604E -:153B8E00B44D64ADF7EBE0CEC03B096F16DE1CBC26BCD3787B99 -:153BA300758E0CAD3119DE50CE8ACB360D5A75B574E6C9CD7E81 -:153BB80039DB2DCF7147E7B8E373DC8939EECC1C77768EDB9CD5 -:153BCD00E366BF9A53FEAF8A74FA013FDDDC6CFB0393483BFFD1 -:153BE20064C16E531CEA161838AC56D2D9503B1F9873E3DCFA61 -:153BF70086F8BA48E0D8849ECE219D66F03605EEB3F09E83F799 -:153C0C0002BC02D0A71ADE2678DBE1ED86578177C34FACB8ECF6 -:153C2100D004E12DE3D01FDC8837BDC88D784B14B9116F1B8B77 -:153C3600DC88B778911BF1162B7223DEA2456EC45BA8C88D78AC -:153C4B00938BCBFFD58C5D442A1FDC818E8C816D1BF54BF97BFD -:153C6000D65DEB9C6B279C5DCE3E03E0576445F89D1BE74F0C29 -:153C750047DE7314E417908DF427E6310FEA1AC29CBA33CD31E8 -:153C8A008F00FFC0673A451823CBE545D73C05E3622DFC231DFB -:153C9F0079699B7A971778D67C5671076BEC8CCEB778DA4DF0DC -:153CB4001F996FF1B23AD6B8DCD11B91D1CE2F8CF93AE48138E6 -:153CC9009BAE84F11BD29FAB44D9E1D1193B0A20EF9DA91F80D0 -:153CDE0071793FCA08FAF40AF7F227208EECBDFCF8E48C73B8E8 -:153CF3009789E311A0D1531C4F8472B7DA67BC41DE597E16F2D1 -:153D0800F290FC3E9B8FD502BC9B251C0F51BED8AEEF88E3B99A -:153D1D009E47F52DD1FD547FCF87DCBD92DCAC23CF6F03B4794F -:153D320057EEC6B5306DE33C5CCF1FD399FEA81E80B97B271B90 -:153D4700A4F8839E0985AB6987B175CCC07B8078905BC9B66F83 -:153D5C006C587B6A3E8E637ABFE44D511E47459021218D203F57 -:153D7100AAF330167B2A715D6ECC401B0688E746C9923F10D617 -:153D86009C385BBEDB378F553C01F965E6E138D3A827696C6ACA -:153D9B00A2B109CF137235213A9F7EF662DE539E18E874C79ABA -:153DB00054596ED05F5CC12DBF0BD24CCDB76422070F3E5B5772 -:153DC5006B66FD43D6A7A7914F6D25BB6B98BF74FA030A9ED3D9 -:153DDA0040987DD1B1A53CC82A3CE4390D79F6824C85E7407863 -:153DEF00D265A57138407607A62D9BA17C7CC21065EBFED03C4A -:153E0400E9413FAA0580E7F3F26306C6AF043E4AF7A59780FC2C -:153E19008C770C16DDDF721EF2F8511CDA5E1C6D16587691BFD7 -:153E2E00CBC63A4570E33883B88C9633CFEBD0665F65039D0EF2 -:153E4300EC164EF6116FC23CE8CC045BD2E9C07D1EE046FD401A -:153E5800A04305DAF9C0B6C1A3DED985BCC7B1FB5D5CA7605144 -:153E6D009D9CF106EB45FBBCC0EF102E777618E039AA511DA462 -:153E8200319C7340BDB7CFD89D8D0F68231EE6B9016075D27CEB -:153E9700383AD8897BD4FF7CE0E7FB45B9C50890AEA70A7D760A -:153EAC00B5E1C0CECBFB691E86FF38C64B368ED6D8703A7A6FBD -:153EC100362E03B8BFD60261BE38BFDC5F32D337244FA36ADD4C -:153ED600E39AA6F28CE3E3CB5924827BD6796BEF219FFFF2F1E0 -:153EEB0008F82575BC5BC09BBB57F59EBE56918EAF54EB645735 -:153F000017E9B4E6B6A30E89C7533C6EDA70B6B225342E4F0ACC -:153F1500CCF334D4F167D0F6D8A6AF525E185F405E1F19A77B66 -:153F2A000BE8FC47570B9D7B00395CFF6662AC13CF44207E1FE7 -:153F3F00887374AF9C8D779FCF747756A1BC6E1ED3CFDFFC9DFD -:153F5400E53F0337D69937272EDFDE0047567BB3DA8F681ED6B2 -:153F6900779BEEDE60D7049587FDCCA2A74C3875F835DFB5043E -:153F7E00F729315CAFCB8E459CFAC6B8D9ED12F5122EC6B94E46 -:153F930084DBC1DB4BD971E201621C78825DCECF208F775BA70C -:153FA8003AD3BD3C543EBB2D76BF9EF7AC063A8AF1A2BAC88FA0 -:153FBD00E9A87F56A80BCC61ACFA3715EA8270F05D1FA4BA1001 -:153FD2009EE2636F8927B7D4A8DAEB1E79ACAF707C17E9FAE127 -:153FE700DC688FCBE6138003E0E99E82CDF1DC8076F2BF1C7DE8 -:153FFC00CB16AA13EACF3A696F837448EF34A429E63377BF6960 -:15401100B55751DEAFCBF171ED73D18930968D6D51DA7CD43A54 -:1540260057969B80F9C2A041F6E1A72D5EEEF415DE3C60489E81 -:15403B0009D50B3CF77E985B8926F215CDAEFF9199FA43BBA8E9 -:15405000EA3A46F5AF02BAD9F42D8C21E5C8EFA83F68AA6507E9 -:15406500DCEA0F17D1164AE4D0ACFEF09BEC21B28F82386BBD10 -:15407A00C53AEF8DE53CCC863BA12D5BFDA46BD06AC700EB5097 -:15408F0002CF30EBFDBBC9B6F9B139F4D62D7AD71F5D6E805B09 -:1540A4008C8F17D1F5908E6966E83A6ED72B45F5429EE3ED1A8C -:1540B900A63A2DCCF0CBB1ED3BB42CB45FF0E333686B3FA90FC2 -:1540CE0041FFB3ECEC5BF5F802B44FA72DFAD8D1CE4A281F618E -:1540E300B900B02C84B677A86C76DB3BF99FD0EEE422F8E200AC -:1540F8005FBC083ED981CFE24B84CFAE4182AF982F4C4F5B7B51 -:15410D00C8F8E5E3D69DB37A34B9B1B268CC49FCDE694B85B9DC -:15412200AB8F454608B768CB223D9DAF28B43D906D7E81BADD7A -:154137005FE5AF95E2D6FCDB17DDAF3E0969020D7CAFF7745A0A -:15414C007171CCBB00C3728774E97446E1610E7E10609570CC13 -:1541610081F683EB92828072A7A6058347FA65909112F78EF437 -:154176006E41FFD4EF90876F114E1EA37DF073F5C3CB58EEA8CC -:15418B006E84B85ECCA72E398C36C1FC5578BF10F827613ECE96 -:1541A000A4618387FC708F93DC502E4F7B2AC306A5C3B2F461E7 -:1541B500D4175D5097E13B07AC345B1230A7C77511618DA6D2CC -:1541CA00FDBCA87364CFE91156CC7F6BB7A694F49C5713F9BC33 -:1541DF006FE4239A8275E6214D5DF2C03A841FC74E840561C3C2 -:1541F4003D8476802170FA88521587BA9EF88AEA631AF0F08C51 -:15420900F22D1C17EC3CD1FE3CC8C03E4CE7D47D08F24FED3C5F -:15421E004CF7FE627BA1B8B1435B84EDBF534D840DEA8475C1C0 -:154233007B41912E8807A61FD3109F6DA83600E10E2ECE16F0E9 -:15424800609555C003AEBFE62C3C04BFCF77A67A70AF79421B7B -:15425D0000FF11EC2F8013F4C3B50D1C832D788F010E0E289865 -:154272007F49CF6BEA66C2C301C50BF5431C48782E05F74EF013 -:15428700CE0D280B6DDA86A0FCBAE0B97EC75EAD65DF04E6FFDB -:15429C00AF30B6A326A5BCCACE698B42ECD38D32FF61C79E62DB -:1542B100EE9364AF96ECCE74D31AC19251EB6C608AD245CD6D7D -:1542C6001AB46D0F7C711FCDC8BD36D3CEF13C18AE55611B6D33 -:1542DB00C1B934EA1E86DA35F61AE9B58DC2989B4D34B97B3965 -:1542F00021A2F289B0BA0760AD5726F19E385D977777D1FC14F6 -:15430500E248C03B44F9639D82FCD94E49FEC4723E26E3789DC3 -:15431A007D0EE461FCF6E35C2AF628D9BC0D74C886953FCA8CB7 -:15432F0063D91084B540FA2648DF08E9D1AF56FE44A79307B46F -:15434400A74E11C205087F6EC567293F91E666AF6C71E26CC493 -:154359007200267FC7B495B76EC18D388A60DF00385BE467BB1B -:15436E00F88E901183705C2FE882F934970AAB5202F7D2ACF8F1 -:15438300981FB481000FF9603CD2E77E0DCF015AF769601F6EDA -:1543980067F6FC1ADBBC346E97B3AF1F6D3254D3D97DCB0FE76F -:1543AD004CE8876D2260E9B05F325FE2388B9E057FC8BFD6990B -:1543C200FF901E1F944F7704650CF3B54BE75CD6D9C17D3A8668 -:1543D70021FF015E6B95057102B9AFA9FED35F53505EF5771D0F -:1543EC00B2EEE580303FCEFDD9611CDFB58FBF50C26AB387DBB4 -:1544010036C2B827DAF30C4B67D09273D066BC9038B0B40A64E3 -:154416004F3FE61BDA67C151E0932982CF1F4D46C83E04B8311D -:15442B00CFEAE8785B6D519E85B90BF05C4A6FF3CFDFD8ED19DF -:15444000EB81733B80CDF71CADE934CEA4293E8F48F76DDFA789 -:15445500FDF632E9F6CF4907ED5DBFDC7A52D4DCABFDFB65D2F4 -:15446A00DFF52ED2BF7C997491778477AF76EE32E9DE60EF5C67 -:15447F00DEF49B73F6D3707DA7B8FD01ADA65F9BBDBE31373CC9 -:15449400F1FADB874FBF53F8FF76FE73C2C5E2F6FF76EB03FFC6 -:1544A9001FFE47854B45F8F7CDE54BFF67E0B7DB47ECBDA5C765 -:1544BE00FEB580974916FB24D9B869EA1F94E2B7AD82AE287AF2 -:1544D3006F573508C7BB56C5EBB6AB74D607656EEF0675DEEA92 -:1544E800EDAA2CDFA9CDBB6E40F5F7688AC835A8FECA063509AF -:1544FD00728BDDA7D75D80B159F236A998DF1F9BD7DEEB35652F -:154512001275FF7A70EE12D7502389974B7A3F073C392036A83C -:15452700E53D2DEAC3D7372BF53DCD4A50BC4D1D2CF98082F66E -:15453C002017F17167AEE2C7F83C77A54A6B0FAB078877200F1F -:15455100A9AF4C2AA8DFE584FB28BC59757B1324DFD5DF9450C1 -:15456600697FC9BE2F7C2E0CAB6C182A0086BD0043A0A87C2C1D -:15457B00B70E60C078942FE45F5CF6053BDFE9A27CF3F967F20B -:15459000229E150FB3DEB578473AE49D28896B888F3CB3F2BAA4 -:1545A5009AB10555801B11CAF4AC69061C35288BC416B5F6430B -:1545BA007CAF9B0DF4D57F9EEFDD3B3F4934C0759110C0817BDE -:1545CF00705791DD9019D81126929358E21EAA1BC074D286E933 -:1545E40028D65DBC51ADDFB956E52A1DD8F2171DD83A01B66A62 -:1545F900B181FC1320203AF4F254B6A822C1B45D595499547755 -:15460E006DDD51680B88E73FE4F3360C8CEA893695ACFDE3E983 -:154623007BB0DC9C0D075793C2BBA784F99A05837767A3EA852E -:15463800F2B06EBDB62E3F2ABD115ECA66F0520F6DA7624D974C -:15464D001AE889103CDB4AB62BE580970A31A996B264DF0EBB47 -:154662006D2EA6BACF947B0ECAD221CC0BF802BAFB1C1890F65F -:15467700F5DD372A280BD5F7DCA8CCA53F74226F39ED1BCCF4C2 -:15468C00A7FAA93D148F3BD5A2066E8AAB3CBB539D07711FE630 -:1546A10058D06DFF1BF05FD10370427BA9A88CA8DAE31DCADEFE -:1546B600131D4AC5A9356A4003BF9DAB55ED233740DBBF41C1A6 -:1546CB003610009CD6AFB170C1C7B95E996DA0B60D729ADFCD92 -:1546E000DDA28AF112BCF7C4EFC1BD9ABAEEFE79DCADAAC8AF72 -:1546F50052C59550DE7577A8E2EA1BD4E192554A04D70156CE75 -:15470A00C42F0B5AE766287E326CC57FF233AAF844873ABC35B0 -:15471F00ACB861DCF53E7E9B52FFA1925EB48D2C24C27D9E6CDC -:1547340047DFFD684F4A0BABF5A76E51B9931DAA067139618691 -:15474900169BB08F07E99CCD3AB4A5220C40BAE31D7D34D76B64 -:15475E0067BDA5DE505F99B7BDAF3EB556D906BC4106FF21F8F1 -:154773007E1A79CE4FD6ABE250878A72B52CDF8AB29D20263FAF -:15478800A3726BEE5429ECC90E080FABC38033A43FB6719C93FD -:15479D0094FF03D75B7F0A70A80DA881539F512B4E6EA736B0B1 -:1547B2000BDAC03CA07D7954EB2BE64B4877A41DE928DB34C57B -:1547C70036791DC0D28BF0039EF16EBF1EF84F96DCA5CC837208 -:1547DC0010FEC1ADD6FFAA8BF900F225C78D71616C58B7278FDB -:1547F1006B3856DB36606A85F843BE0773AE054EBBBA1BE290E4 -:154806003E39C070D71CFD4AEFE3B54AFDC96AC06DB57AB97630 -:15481B00F4129B6947BF64563B421A94433B0A8A77115E1EB6C7 -:15483000DB12B6A380067E73DAD2F6C49FAF2F0F6E00FAC4FB9D -:15484500B7B35BD7CF0BC6FA39F10ED57157446F5D8F749A376F -:15485A00B0B68F9DE8ED73BEF52FBBE87E9DF2C4DABE8A6C6F1C -:15486F001FE7019A5FD9A0B9810E1781F688BFAB8916AEDE0ABE -:154884006D0BD0E10EA0C30EE2E9C5B428B16991B4EEF5F17365 -:15489900C29550766CDD14D105DB4D6CDDD13974019AF86EB218 -:1548AE00E9027CD7B7B6882EEF2BA2CBABA43339D3B7B742BF10 -:1548C3001E29A213D987863680FE9B6D5A9D063A39B4D9F01E37 -:1548D800E971A6881E3FB2E9817D3A60D3E2123A006D8A695101 -:1548ED0016FDD4FAD2E8DAF5EC6ED62B663FD5374FDAD057C62A -:15490200FE7A7D79E26FFAC4ECADE4AEFF3CF5579FC8C01DBD70 -:1549170093F0CE6F6ED05CC07B2F96C5B47207EFD04F2BC4AD95 -:15492C00C0FFFE42AD5873EF2CBC975F0EEFA9C548F322BCC7E7 -:1549410009EF4E7D8BF10F3CDF779D8D7F5C13C17EE2E0DF5732 -:15495600847F17AD6D58F81DB1F15B897C0AC2F0DEF0E23EE01F -:15496B00A47F89C6058B66988EECD3DB74B0701E9905CB97015C -:15498000CF6286EB7D12BE49E03DA59007DE9FBCF763B7A9F5A9 -:154995003D5D8A54B254292BB956C1362C02EF61273AFAF6FE68 -:1549AA000B849D5AA3F84A3EA2784A3E6A8571ABFAD8F537F4B0 -:1549BF006D8BBB7A11AEC5F69DF2D046BCA5B28BC648F4477B35 -:1549D40018CE1C05CB47BB9125CED86D8F1F180F75A511AEE79C -:1549E900F3793FC429F4FD27A1EFE3D87506A693B85E82F2017F -:1549FE008C75FE27ECF8DF82FFFA9779FCFA8E505E2975976B5E -:154A1300FC36D4D3629C7597298C2C795F74FC768369A4F38504 -:104A2800FEFE99F5D6F2FF06E2E5D1A4A89C0000A7 -:00000001FF diff --git a/drivers/atm/sba200e_ecd.data b/drivers/atm/sba200e_ecd.data deleted file mode 100644 index d097e743b84..00000000000 --- a/drivers/atm/sba200e_ecd.data +++ /dev/null @@ -1,928 +0,0 @@ -:150000001F8B0808AC5A10380203736261323030655F65636426 -:150015002E62696E327D00DC3A0D6C14D7996FD7B3F5AE71CCD4 -:15002A0078592F3F8DD70F0AA949E8DD022E07F61A1644AA40C3 -:15003F00012D88A433EE52268844E8924B571792229D1B0F8EB1 -:15005400013B7DD0C7608813E1640D5E58529C6C909D101DE4AC -:1500690016357749A4E4BA8A7227541DC9AA17295C4A2F76455E -:15007E00259438EC7DDF9B19EF7831C4A1524F772B8DDF9BF742 -:15009300BEF7FDBFEFFBDE1B3FFCD3BF7F88B808896E2484FED3 -:1500A8008890844A880EFD1CB4BBA00DB710128396439B8076CC -:1500BD0018DA4E68B51FC3036D16DA1DB8364E88026DE92FBA6D -:1500D2001EFE486452BF7C63D90D63AE825E0863FB54E1A984C2 -:1500E700782F999F6AB59F9E3C49B19D522690D8ED9FFB737D9F -:1500FC00FCD38F45DB66F353D2B6AD1433AEF2F2F209D77F491D -:15011100BE34E18787275C3FF52678EDF13693B20B7EE47FE17D -:15012600E71A20BB45FB4AA95D5E29DC72DD983C8589E52B4C68 -:15013B00927E7959B9A987A7DA6E4DCF24842D778E97CC7F63BA -:15015000F90B6D6DE8BEAEEBF97C299D49C95956A43F7A5BF4D5 -:150165005F7C512AA1FBB7D87EF4AFBF99905E79919E97FCDF83 -:15017A00FFB93C759E5BCDF3F48DEFDA29E89C2A8EA109DC0E0B -:15018F005FF8FFFE2B387E24ACB3FC6765A432BB6F911CF4C674 -:1501A400C1977CFA72F2308031121A8EE3BC3E026FE14E96FF67 -:1501B900025AF9AA21793BD46B5B3B1A708EC8A429FF1CF1557A -:1501CE003E4F7C81FDC4977802FA5DC447C2618EEBEA932EC057 -:1501E3004BB79000C012130F873C52EDEA50657DA14AB86BAFA6 -:1501F80014D4B75C5C467C1D4F126F20B8231E269759EF9EFE32 -:15020D009D846F61249CE1FA03844C0B6A716FD52F20EB9C6518 -:1502220035C1447C7AEB6916F59268404FA9249C341086C4F6C2 -:15023700182477ACC79FE300570FFC87E3FBC3A4657AEB6A1692 -:15024C0085F4D4BE7FB34AE4F5AC7D7DB3FA3C213546D2DD045F -:150261007C32C81F7230EF6A9E22B7A8B81EE7116EDFCCCB8A9D -:1502760067E549751FF5B490DC6C5641483010844C26EF66BEA1 -:15028B006067FCC3B9C4E721F3D53DC3EE1669F72655BAB04CF6 -:1502A00095B6AC654B008EF03EFD6EBA6531EA08F113F958A63E -:1502B500F8F4EB015853B966BE7AB950A8FEB04D8DB4FF933BA0 -:1502CA00021254BC2478DA75DB3C456FC2D306E429775C5F2546 -:1502DF0078A202FFB7626115F9D9AB95B5608BFC601B04DD5402 -:1502F4000575C0F90BA1C39DD5640A91FBF4DC8A2D0DE780D715 -:150309001DC0AB3D1FAB26E3C3487898BD07DA0F053964FC6180 -:15031E00B09F6E2C85F4EFDDC054B2B33F93978886ED30B49447 -:15033300768879E085CA723BCEF75CC37918AB1763BB718C8F81 -:15034800E218973A503F887F41CB78FCF545FC0256ACB3E8DA10 -:15035D0034052D8BEE84341DF8D924F1874DFC62BDC065D1B458 -:1503720069396575E2BF52823F5CC47F03AE9BF17F2BFD283F5C -:15038700BE7DFE1BC41863C362AC4325B1FE8C3D3EF66ED31296 -:15039C00F6BE39FF0257281DAF69ED17F8883C2F83386A5A1923 -:1503B1001BB5E418C30B73E3E48AF573539E9BF37F2BFCD76E07 -:1503C600827FCCEEB1FE1E1B7F838D9FA45929AE521C387FCD8B -:1503DB00E143B62C02A73CD433A10CE3F647A7B91FAAFA55D204 -:1503F00030CFB4AD06B685FE0DBED990327DD38903EC5BB9A572 -:15040500685F6F5587E09B3474B0AC44A2105B784D2CAD1ECE76 -:15041A00B85B80BE512D77A9570A85A0D33FD6FD99EB3BC4FAF6 -:15042F00CE09D78FAD053C57715DCCE12B18A2352F4BE4DF3E26 -:15044400A3E73F3562F9670D7FEEAC3AFD034D21B14BAC4EB966 -:15045900475D4C7FC5F6DC3B9020F2BF81EF26793FC4F5605035 -:15046E0089631EE0D00FC49222DEE3788D3E00FDB481E324B744 -:15048300A8470EEE8A93DC7B10B366C4F7CDDCA178E9E3ACFDEA -:15049800FD956A27C4B7F6F7D7837DE688787987152FBF0532CD -:1504AD00C87598AB92BC1BCF26E134E7D056692EE07F3ED0CF67 -:1504C20033CC96D2CAB56AA12CCB24D72A55EADDC8BAC949C5A3 -:1504D700A50DB0EEB2E30AC28C421A3D4C5E56C05E0CAB886E6F -:1504EC00F23A8C67712DF4FF45113C02DE68FE6D03E4309096C9 -:15050100DB45AABB203749D1BBD5BB80A7629CBF17F86C6701DD -:15051600E06D6788F8BC40FB933677C4BBE135950CFEDCC09CF9 -:15052B0087FC728B5FC455F5515EED2E3BA9A05ED65592181934 -:150540001C30B244C0E918E7BB519E705AC4FC2A42FC2496D294 -:1505550047B7F635873457A377C309F0B30106F089DD3F9C0F86 -:15056A00364FF16B85424D9DF26B359AFF9457B94EA8B1FCDB9D -:15057F009C84327177E57915E18379C83D202BD2385A0672CBE6 -:1505940003461053742C63CEC97F32C0F601EF8697D559078ED5 -:1505A900C3BE4D097EC0EE19B0BBD8136BE99A8829F3A21ECFAA -:1505BE00CAE3AAB013E634CB4601878D1EADB5725A02721ADA1A -:1505D30000748276C8A27FA15F800E9016D959D40FEAE5975DB2 -:1505E800DF079D844D9D583CD83A09002E874EAA854E56AC5F7D -:1505FD002CF0900C0BB60AF9C00FF764AC07F676126B984CB013 -:1506120055E82BFA3CD80FD619159837071F671F423DF547CC48 -:150627009D9ABBB94EF94FD5EDFED9920D9ABB2948DDCDE3ED05 -:15063C007B3FE4F1ACE201DD96CA8CF2A1DC1EB2006AA3679877 -:150651000CB2CABD9BD88E3B896FAFB6B1C9BBE105F0796ED6EE -:1506660014E1A5ACB002FD803221E3D52B26CFBC5F7F80DEBF28 -:15067B00988492F15AB2470D8C32C12FE9EF63DDD98560AF85B3 -:1506900006ECCF8CF5F4E05E053D0AD9486CD0C0F501D8C35394 -:1506A5001C72BD05754ABA6D6364519B29DBDD753F5B485DC4FE -:1506BA006BCAFA6BF53A79F216B2E641D6939396B5F5DBC477B6 -:1506CF004CC8FA30C8BAC39435047BBBE1F7A67CB1E3FA532095 -:1506E4005F6DF63BEAD4489390AD2C36430DE9A1E66F635D12CB -:1506F9003B20628096FFDC38EB2553A0E5B81F85AE5007644910 -:15070E00D12FE4BE8CF5801EFA8A7AC8BD6A209D523DF4801E4A -:1507230074D043D0D24325E80169074B68831F4E194FF38472E3 -:15073800C0972AEED189F7E6346B6F46C6E6D1C78027EC8760F4 -:15074D00EF3AF72BEE55C253FAB5151EC10BC417D8AF2761BF9D -:150762007ECADD9543AA6BE659D5D53524F6EC11C79EED297B45 -:15077700C5DEB37E9C3F52DCB335E8FFE8D7CE7D3B0BE05046FB -:15078C00BF4346AD9C4C71EEE7B1FC943BCDFDC1CBF1EA46B191 -:1507A1005788F48AD452BDAC53F4AB5DEB45BC8E06486C8EF056 -:1507B6005F6EE65EC88572F20A93D6ACC59C974940CE2B4C4D3A -:1507CB00B05EFDB8C2662694C06E880F77A4541FFA4FCCB0FC60 -:1507E00087C7671D931ABD55AB61BFC6581BD118FA4ADA05352E -:1507F50041586188A322F20CD3A03568598B1F7CEB04ACF36627 -:15080A008FA9011DF3FFEF0D51CBE01EF84BB6DB3E6764B09B53 -:15081F00E9E04BC89773FE51F0AD1524C1B6E9879693F065A3B1 -:150834001E6581396FB61DCE4A585F7C435A0F9AB4B278CE7380 -:15084900CCAD4A8E3621FE34B9357E5D33D7E74BD637265BC568 -:15085E00FAA513ACA7DA492677758B1C6DCF47110FCCDD958C37 -:1508730034A1FEEDB501FD984A61CE8BF0B1B9803B950925C1C8 -:15088800A6164C8305238BF5A9CC647C22F0A6D48CF11F7DAC82 -:15089D00167D35D76F94D64FEB1E76D43FA2AE642C8AB58F2916 -:1508B200DF196CCD7ACFEA53689DF58F63FD1C0D7D1060A1FEDC -:1508C700411CD21AA61EC43D0BF2E27E1A572BE3F1F93E2FEEED -:1508DC0053C31FCCC6F17C5BA75C51FF86BE06E7DDA19D24F6BF -:1508F10004C39C9E7B40D4893C8BF50E9C875D33CD9A270A7153 -:1509060003EB2B92DB8E7006C2C9C119702E7E5A9C8BA747FA68 -:15091B00C59938181D54B1CEC0F544AE15676212AA8F4F8F3447 -:150930008873309E89CB8066FBFEFBADF3F0BDEAF32EFB3CBC70 -:15094500D43C7BDE10C78B67CF89F2349E3DDFAA29397B62AE9C -:15095A00B6CFC3B992F33087986B3F373B0F7F4D8C7C4CDB1875 -:15096F00F11C3CA3BA601DC6BA3D10C776BF9B56BC55C7314647 -:150984008A5A40C43898C739A0853569CD9CA4A7C98449A13EBA -:15099900A222060A9B891858EDADFA15F8C48098DB4EACF36D2F -:1509AE0091DF1EC423D60B9D9B7024F62763F7BB19657A24259F -:1509C3006C00670103C726F7FCB3217C16EC1BA8492A585360D5 -:1509D8002C47BF7906F9224BD94BA843FB5EE0366C531F98D827 -:1509ED003613DD0B94C796AA28EB3EBC178056DC0B403BFE5E71 -:150A020060693CEEBAF15EE0EB6CD6FE17B0D944FAE413D8D15A -:150A17005B750FD830CA2C7939CAEB6D9D6DE290470CBF43DE6A -:150A2C00042153049FAD7D967D070C8499DC73613C3F729F6190 -:150A4100E39D01786D5BDBF1E9CE478AF1C5E5EB107ADA94DD30 -:150A5600D3689F51E58D49A5A67590C5800FAC0FF04CAA79CD1A -:150A6B003C8DF05CE80DFC0A748363EE92B161475C9A41E7F61F -:150A800060CCB93802B97A659F1AD0D07F1A18C81E708580C77E -:150A950031BED23C564648A3E66944597640DFB5C63C7FE1F838 -:150AAA00E1DA2106B508F7C82F412CEF33EEA4A70D29B9C7210B -:150ABF0097CE104EFF119EB74C5C4B268B2B79AA880BE087AD61 -:150AD40073A08BE8784634F0DDA6F34DE4D11DF2F43878D02783 -:150AE900290FC2651E30E5D11DF27C2DAE1279AE96C873F536FA -:150AFE00E5C938E479C7C1436692F2205CFE7E539E8C439EAFE6 -:150B1300C55522CFB51279AEDDA63CC991A23C67478A3CE0F891 -:150B280064E44138D99207FB4B268BAB449ED11279461DF2440C -:150B3D00ADFB0C19F3B9E5E3750A53EFFB09D2357D04DF975A45 -:150B5200EF19EBBDDE7A47FAF83E43BC2799F065A0B1AB4CB4FF -:150B6700ECAAF59EB6DEAF59EF17ADF751EBFD1DC0B38B9EE038 -:150B7C00D8D760AE93BECCC5BD03F47BE86B5CD403D04FD337E7 -:150B91007994DEC5CC73C5592303EBE05C51334BF33407939EC7 -:150BA600667FDED3EC053B606D8F3236D05302CF7658BB9ABEDF -:150BBB002AF074437F337D83E3FAB74C3E38D2DC4E777313AFA4 -:150BD0006E0C025EBC6B5841DE6167B6BEBC5CDC59004C15F5B9 -:150BE50034E2D80B5B5F136359C7D8335BDF1463C8933DF6E484 -:150BFA00D6BDCB6DFC7751D37E886796E8A7F9768B3EF2B4B65E -:150C0F006E60998DD386455C36ACCD2BF216B26011EF5F514FEF -:150C2400B3B84BB1743AFC88A9D39CF8EE61CA3EC3CE1F304F8C -:150C3900C7CD9BF4EEB6700C9A638CFF9D09F3A1850369071099 -:150C4E0007CC651F2DCE452C3DC6617E1DE80F75C7A01FA7072F -:150C6300399E8FCE099E2E0B3E1FA5CFF15EA1DF1EE3F48870DB -:150C780040FF03D73D4D7B67526543E88D85CFE692CA0F962315 -:150C8D001F9D424715509B2E592E352D0AED5EC861EE6E319754 -:150CA20011FC56243D8DB3DE949A82A1830B0D98AB5A6EF28FE3 -:150CB700FAAA807D72FD2BA9E98BDAE7161E82B93F367B9A2BEB -:150CCC00B4F2C6CF2EFD2182387F57CB22B8FEB7BD831184FDD0 -:150CE100E0D269C8FB3B044DE03FA38B7686E019E4CCC444BBDF -:150CF6004BE026E1682629DA84E0036A8E0CEE89E9172EABAEBD -:150D0B00F735D87FAFB0CA60268EFA31D75D36368BD6D41109F9 -:150D20006B8602EDB495C755D7FA47A0F6D9CFEEC05C097A3363 -:150D3500E9268D0ED1EE303A45DB23F4590EE705D7FEC701FEB1 -:150D4A007BAC2A1806782A6219C20F8A36619C15ED52A1F32969 -:150D5F001700FEFD7F10B5D5D4600CE0A386C977D2E887F6692B -:150D740061875D467AA498DB4808EAADB0226CB30D6C93A007C3 -:150D8900B81CCCC1D845B6B4CCBA2B17ED45A301DA9DDF273E14 -:150D9E001E76B7C0318F1D182DF8D1971E85F14A7A02EA055D0D -:150DB300E8AF0CCE160BBE8370E6BEC25CB9CD82457D5BFB8D79 -:150DC80061FF29A029FBDE533B9625AD6F6D507FC1B896FF8DAF -:150DDD0011681D62E8C0DBF3AF1BF0CE75E02D104DA9B20FCFF3 -:150DF20039EF1B121D323E69B0F8A1B3D9F52F4D1A4761BD6C70 -:150E0700F1C32D7E8ECE29F283B9EE030B36EBE0277B0B7E623A -:150E1C000E7E36033FF0CEF904FC6C76F0F39845E33DDC47160B -:150E31003F598B9F4A073F98AB5659B0E86F363FD8BF193F51AC -:150E4600073FAB811F78E7C909F8796B71919F8FBE30699C1BBB -:150E5B00C19C66F28334909FD6D9457E30D79C3161052D37C413 -:150E7000D68EE694310A676A3BC63A3F0F6874906BF434C4E84F -:150E8500CD4C0EDE173FBC2CCDF0FF560EE74E2AD65D9091B78B -:150E9A0062CA7F8CE0652EF17B1D79334EFB7959D57995E60779 -:150EAF0058714DDAB868C5631B5601B86ED8DB7E888DCEF53124 -:150EC400DACD37037D05F850E85178AEF0049DCB77D105E03353 -:150ED9000DBC9346C056AB799DB24D35C8A1447D3EC5BAF55427 -:150EEE00A207E093F41C4F53C60FF79E663564409DB6A597D514 -:150F03005EBAC23AB67C97EDA99DCFF66E59C8F6F52E639D97C5 -:150F180056B223B56718DED37CFCDB32DCD30CFFB7E7D9DEF32D -:150F2D00ACF2C231F5E0A5FD500FEC5FE2E4EB9D30F155D1D593 -:150F4200CD6363B176D6B090F8FCCE3121403B3B7A93F1CDD75E -:150F57000A378C2B5A3BC77889FA09D44FB08EB7B33B9B26184E -:150F6C00875AE06A1DF179434911ABC046F2DCE4318EF6C5F74D -:150F81004F46AC1A413EC789CCB844C51D2BBF8AFF6810E6FCBA -:150F96009A687BF8A8DBAC7586451B66A4007551554AEDD6878E -:150FAB00946EBD5F9926A5D4236543CA91E88072186CF9ACFEB4 -:150FC00086E27DEF0FAA8005E0837A9722AF632AFA4185833FB6 -:150FD500BC8390D890187F52AB6CFCC4FE770F2B6EFCFB0A33BF -:150FEA003F6A63B934C991E73990C72A925F35CC4A3E8179C4C6 -:150FFF00CA8567451D63E6AFB366AC039D99F98F5B303D026617 -:1510140047314F8AFDF09845277B039D3BC6D131F3E559510FD6 -:15102900D97432169D0F2D3A264C0F33E3709A87AF12D21B76BE -:15103E00B5941F48A981E83CBCDFF3FBB5EF468290ABAE5E372C -:15105300E5FD40FBEBC6CBD0F782FEEB14380779061290B39AFC -:151068005DA1745CA678DF1B66C92CC489A4AB65333D652C022E -:15107D001C92FC3DC8435D3C14DD1F3948BA13788676877AE21E -:15109200D23D50A3C5468CB974C4705BBA8ED02E234A0F1A8197 -:1510A7007C8A734F6AE702DA67605C895D0039F2FD5C069C38D8 -:1510BC000E276206072EAF93E6A617FA9A9DEBEB9443AA61E19E -:1510D100C0B5D8475C147049A1FA78B464BD1FD647E97306D4F3 -:1510E60010D6FAEE09D7E7FE1173537D1C7909C3DC02A833C232 -:1510FB00B48BE1DD96413A120AFD2FC3E3C238779A19E470422A -:15111000D23A0C3FE46037D6BBB17EC3AB751B95DA39718F365C -:15112500DE8FCF5A7EAC8FF3E331FFCDA614D9E1BF55502B8C04 -:15113A00F928F801DA0F7DB4FCC0805A43E6A9A66CF5A66CD11A -:15114F00BE66A73F0768170F6A529384E766C29917ECB1733E0C -:15116400F1E1FBBE999DCAC54DC4F7E2CCA422D3F9C236ABD16A -:151179000EB096AFEE7E085BCF52F13F2D15B383264E79893719 -:15118E002E43FF568F0947444B8336DF14F65D1D91AB16A81DE5 -:1511A300EEF90F79AC71EED71FB2E7F1FF6AE4E8DC07251B479E -:1511B800B4FB41BFDD5F591C17FB04E498438E36617E801A931D -:1511CD004E8BF5604D631CA2520BD51883B37A0061360998CB74 -:1511E200D6779F4EBCA3A0247692076973837DCF82DF034657E0 -:1511F700342F36BFD19B7797884F4E7633C487637EB95B7D077F -:15120C00713AE82F17B829C33B5949FE0CE87719B80EE95BEBFC -:1512210032B80EE89D71F62F3AF158BF83B9E39073F0FBEF1552 -:15123600568DF74FFC285B8BFB92DE1B09D2798DCC8A0F3FA1C4 -:15124B000F35EA629F778AEFE5BBA75C413ADC2F3F67DE75C28B -:1512600018E4AB1A1BBFA4CD6558B309D81F7EDE4272FD7C9ADA -:1512750003B6C2829520374F16EE10F0BA0AE2DD0B5A5D13D6FA -:15128A0008E677FE432A9C9E184473435AF339F8E46CD63B4C08 -:15129F00104FA67AF42893454EE83FF3BB42A11AEF06B789B5BD -:1512B40069B17681B69FD5C84FAB776AE759448333656C9E811D -:1512C900F489DC6F081EB09F4B19923C5745DC52FEA88DDBE4E5 -:1512DE0011F6DA589FA78C2CD058A44D6FACD2A6477EA04D6DF9 -:1512F30044BE376975CDB67C923C5B2D956F3273820F7BACC455 -:151308007E7C18BF7D9F03DB65E24B08A9C63AC6E53BA7BEE98E -:15131D00C2FBC734D64D747A10725E6CC8C0DA424A0E31D7BBE7 -:15133200E7D5FF065E7B5CC48BF6C77BF9465AD358456B227E15 -:151347007A47E366D0D32A5ADBB8CEB237E2A8965F1577D4E057 -:15135C000C34289F51CB80C60298AF86BE1BFA088773F6B90BB5 -:15137100E15DD638AE0F26E78571BD8CB2027D19F8284CA5ECCB -:1513860008E953189C8702AE3EF17DE059F17F5203D67D685A64 -:15139B009CD1719F797D57D4368823337C4755D7CC4EF57052CB -:1513B0006AA9B9705E9D23EE5933868EDF5E760E88EF34384755 -:1513C5008E0DB1CBE2FB0C65B3C8A9E508432C18F17DA56F880C -:1513DA00CDD2BE6A126B89398EDF4DF4248EFFBC89C883064DB6 -:1513EF00A6F03B8821AF1950A330EED79AC5B817DEA980AB6D72 -:1514040092F05E22F6BA7118FC026582FD5F8D7715B3A2A71B27 -:15141900C59D456ED038AC4942EF788FF70CC43C5BC6A0252368 -:15142E00CA11B1F27D7D01CF75FF43CC13064755A4D993BC91CC -:151443001988C3038611280C0F1CD6E045326894648038C168C9 -:151458002556E40688EE7B5CD089266EB450729055768B5B5FCA -:15146D003081041F5CF34C206BE1DE84CD94932B2203071A3D8B -:15148200ACCBDE79BB68A5AE721677C7D5B9DEECD69E4779615E -:151497008D6CDC65AB38E7BEAFBBDFCC9BC9A0E0DED5FD987AC3 -:1514AC006FBEEEF77D5F7FFDF5F77DDDFD7547F5F31B315A88AC -:1514C1001BB88ED10BB618607BCEF31C0253B2E941318E59B05A -:1514D600E751CCF18671A03F4CDCB28FC53814642D3F01387A39 -:1514EB00433155770FB3BC0699D9A328ABEF954FB03595493179 -:151500002F4698A20CB3BD8A291B2C2060E47206562A6057702E -:151515006D46C454576DDF30DD1B292025CAB0698761DCE8CF5F -:15152A00819102899467C3E8203CE5C8192A83AFA9C032D15E21 -:15153F00DC8F21F4769E6B22BEBFF4E59C7F70B1EFE3D4E291CB -:151554003FC5FFF019EAE881BE606BC0316AD10929C3F44592AE -:1515690030FAF4188BBB3F01BB07D1C3168CBB93E9B888CB7601 -:15157E00C1548AC935947C3DCD6728F916EDE819566B6CBC2309 -:151593004EF46F7DA14186B319437E5C0345D9C8C3B42F1C65B4 -:1515A800F07A019F12B1117B029F3EDC2F92193EA6035EFC1FE0 -:1515BD008E1956FFA7447F768BFE64BA60C90D6224A00FF3A197 -:1515D200D7696F826C29B2D96359B4C7259E72CEF3BD2FD3E9DE -:1515E700C559F685CBFB75B6CF555344C27ADD1915C74C0DDB68 -:1515FC0013E730B2613AACC00E2BC6711C376BC1E339C47B8D20 -:15161100CCE1A1E409E0F7049D3FC9E4EED3053F0C0636CD57B4 -:15162600191773BF8421C3372C8708FA8C3DC3678CD9888F0E7C -:15163B009BF9EA933CF549BAFE5B5CD600837773773ADE8E53ED -:151650006931CC3E443BF19DB5C90BBC5B6D82F729479CE97FDA -:15166500C09B29DF579729B7607BF3C0A40DD3614E3B2C67FFB1 -:15167A0091E9BB1863D6F8B58FED8E9CB18D4FE7C7710DCBAE50 -:15168F00F58D9EE71BABEC255B19C674ED8BC82CCBA6A03CAC55 -:1516A400727C5F72A1536BC8299F85B4EF47DA71A3028C776FB2 -:1516B900C4B945C6BD0EC0157E28639F5037702C5865E5F6325F -:1516CE0090834BE0614F1B8EA21C1C56FBB9FE71989E0B037C5D -:1516E3007B2C983703D3F3C0667AB261D8A62E5B9B2D58671E54 -:1516F80058A1C70ED38D4431D8B685423E246AA0FDC0F1E915CD -:15170D00FA1E4FEB3BC0D017D8D63A4811616B1AA8BF5EA6BF42 -:1517220031C3D2F39907713D3C418FC2B8F785B86DCB8743BE31 -:15173700611C5086397BF230D6331B6CF350B4EF681FB7A15DC2 -:15174C00C1B526F8EEC0C2B8CAF0839EC14490E683CB36B861D9 -:15176100AFBF203F5C0678AB43D8DF626E732D99615C500F659D -:1517760079E5E5CDDFD6591F27B43E7DB8EDC0C284CA7310AFE4 -:15178B00436EFF8BB8B09D5FD507C68DF0F58D7165F76B42D8B7 -:1517A0007BCB77737B9C2DEB6C7B9C8717F886F302710A3E0187 -:1517B500F76CC4C7F6C3F3C8214F7D92AE9FCDDF6E9BDEE11865 -:1517CA007678A68F71E2993EC60B3CD3C733C903DBEF9E3EC6AB -:1517DF009D9EE9E359CA8161FD57ECDF66E6BC221EC371CE7D03 -:1517F40003CA7489CDF7C15397785C62129B2F9473CA245B99AC -:1518090037A7CC652B5B905356642B5B2C0B3F129834E23DC8D7 -:15181E00972EF2CBAD582446838A3390893D6294E5EA425F6464 -:15183300628FA8C6E38C9CD853CEE4C8C8BE924647DD2AE853AA -:1518480098670742867C3B2105072B357D32E5763A3AD5367878 -:15185D004A20935E85AFC3FE0874EA70F4F7E5646A805EE941AA -:15187200044EC44576EDFFFFFDD5D610F7D86729370D75A835F8 -:15188700F749EBACBD4DDC2F24EDFA293667688F9E1A67CFD1D9 -:15189C00532CC7AA3D796A929DC989D2C446BE16678B410D07AF -:1518B10019FE18E539713F71ABF7F3BC65EE67BBC1CF0E829F2F -:1518C600051FC9E456C2E466F9EA1AE083783AD5F2CF84EC22A0 -:1518DB000E263BB47D51C0E307F847F749AB91D6D98D7C8C8CD2 -:1518F000C013D71B1D0A8B154DFCBF212BF68CD107BF617F17F3 -:15190500B179E0A4896D045924842C12421609218B04CAA2F079 -:15191A005E57A33D7EB95EF9E158F228CB033395AEC0D1422EFD -:15192F002B0EBB13600702F12CD83D00EB0B9CB66045089B0F62 -:15194400B05B03A30863FB3A5CA6572E810C4196172F4D9765C3 -:15195900C37AE2BE700965E95F7DBDEDBADEF69CCBA30F054261 -:15196E001F3EAA26EEDAEA6C3E2B24E2AE075E9CC0EBDA3CBC7E -:15198300C6A17E29E3B574F58DF4C1F5F27B3C0FBF8582DF525A -:15199800A0DD1F9AAEBFFA35F4B77322E52E8076B44F4C6F471A -:1519AD0012F0344F603BBCAB6F54976EA43DF13CED91447B1A71 -:1519C200818773F7417BBE01FDD6FF8236297E2A2BA594D97E0D -:1519D700B0798EBB0889001CFF4BA4D6D88DEF01D550403A8B99 -:1519EC0015CD9495EA57D91E33D899FA08AE37478DF001EE1352 -:151A010095837CAE32FE32F86249077FD8CDD64B0DA837161922 -:151A1600328B9A4E9A139F72DC7EC09B9AAD1B53F0DFC1FFBBA4 -:151A2B002E7C9ACDCF0551F70A3C1B20DEF42A9C1E51393DA4D7 -:151A400083F4D02BDBE92D867A454D43663DD0DB2D709CFE9440 -:151A5500D3EB14F4E0BFCB2E4F59C8B3086489E5ED5524AB7C94 -:151A6A008E65FFAA7879434EF95C513E26CACB73CAE789F2E328 -:151A7F00A2DCCBCA278D1A9A39CF92823652D2A5E2DE9D0B7DD7 -:151A940074CEF9956E888768D4B905E28CAD55B8AEA977AD2A29 -:151AA90056A4A02AE29A9E8517D5AAD0BE60AD2D5F60CF48D3BE -:151ABE000728ABE7DB3FAC0AD8E01FFFF0E5AB085FB3F5832A70 -:151AD3007B7EC18537BFFF1AC29FF8DB9F559162DCDBEE373A7F -:151AE800FFE5856AAF4FDF4A1E236E974ADCD3F8B4E58F2987E0 -:151AFD00B2FD338F35264DB4210E0F9FC331989CDD362B3EC2C4 -:151B12007A3341D7A7D6F2DC19ACDB5337ACCE8C3C12D85FC732 -:151B2700EC391DB5EC39945967724637E69FEF1B9FA7DCF14B5D -:151B3C002977661E46B55EDDAFE2BE0AC48DEEEE8551753D59D3 -:151B51001EF490E5AB16298EE0799045CF42AA6ED0FDC17369BF -:151B6600B9C4D99AC4CD4C1E740FC6284E88F50673CADDB672FB -:151B7B0009CA3B3372ED2E9048B70BCA1D65D07FA2CE22E6D307 -:151B9000F8B73741FD0651FF0EB0FF3EE1DFB0CC07651584EB9F -:151BA50013FE5F7261402B81FF8B6C75965C8869DE1C7E1E8494 -:151BBA007E4A4462A60B7C6CF96F53EEE8D594BBF9CBD42CD1C5 -:151BCF00BE7511B0D3A03F5976C52BF45442F9839E86927F6EF3 -:151BE400E84E320BF50CE3600B37AE5FE21EA16CE30B73854FA4 -:151BF90047980F360222BFA108F02E00F97B9712B7EEE7BABFE7 -:151C0E00600DE016FB3054F8F31749BFD13B3AA8BEB90CF7E984 -:151C230002068F654B0C561EA830D07717B863DA0F963E5CEE8D -:151C3800AD8CD2D65732F1168577A90F2255788EC2EF1CFC9498 -:151C4D005EB0AFF01B17BFD65EBEFE85F82EFE12D7BF94C6F455 -:151C6200BC4CC0A3FFC1E161012F009F5683EF7480CE837E2B7B -:151C770000FF50CCD618264DE9DB84BC823E830E9896DCADF9D7 -:151C8C000796596D9394037406B3ADD4083C4A48D17FA6DC93CD -:151CA100249BAEEE22B370AD1BF1FF33CC476702DD31A81376E8 -:151CB600733F65E191051EF932E76DF493947B90E7F5883A101A -:151CCB0007D1210DC7EC646A361B23B837D6F7F7C7198C4CCED0 -:151CE00026DE9F0EF277F883F2CED48D9AB89FD6377A5C9D2F99 -:151CF500B1F50E93EFB3454DDC575B6BA3C3D71DFB8DC7C61FD8 -:151D0A001B5F363A98A53F37A3FE209FA043814ADCA386B8203C -:151D1F003C443146DBAFAC0BB01C45CC8D8BBC4B95C819C3C77B -:151D340072E8BF303D7CED9BF68A7557BE8E3BC2F70C020ADF8D -:151D49002F40BA387EC227CDE7593FDC40FC373E8438D2F3B0B3 -:151D5E00AFE741D0065A69FA79F475DB3AF0CB69FB17A5E3B899 -:151D7300D62B1BEC9C14192D20E037D8FA3EE0A0631B591E841D -:151D8800CF9A67CD2103EC0C12CA784CD834FCBEFB5EE296C690 -:151D9D005FD2E40F5F52ED362D6D77D99C6CC448FDD57B923824 -:151DB2003324A32D66F3191AA37790C120E6EA4FFDFB7095BD05 -:151DC7006F6E1263BBA482E45D1FE56B9BBAC03B22F026742EFA -:151DDC003FC0ABC738DE25C7B3F0CE1078C757E7E0457B08F1E8 -:151DF100D5BE85FD2A3BAF0F3610F126393E7D19EEC9CB83B482 -:151E06003039AC4BC933BAAB28C6D6F966029DB961AA3922869F -:151E1B007128296D91944EE316F91D6D2C95F279A25230334FC2 -:151E30000D1B1877EE72A0ADAA6DB4CEDD635E358B4B587EE23F -:151E4500A4A9E2B3B8A291C80FBCCAE64201E554E8D13CED0713 -:151E5A00FF15E847FFD5CFFCD7BE8523AA67B4EB5E466F5CEA4B -:151E6F00A49571CE7B38A67B301E13F082484C972B13AC7D8726 -:151E8400C801D584B1ECDA30C8F6D1BE85361EFAC411194EB76D -:151E99006F6E6830687DCBED46FA7D1A3FFDFD997CEC7DE0FFB5 -:151EAE003DBAE0875E831F80CB601F91173B4D07DF4FDF9375AB -:151EC3002604ED1501BE8B47F83C5FC44F203B2E1F9E4F922D53 -:151ED80047B9EBD5ACFD0B186FC88303FA1AD73F43C9237B8A4E -:151EED00F95C4DFF25C07BC351D5E5116B64C0D3C5421DCF3873 -:151F0200CFC2F2B64D3C470A7DCC3231BFAB653A12D7FF14CA3C -:151F17002CDE19DF507FD7261607B33C8E7A51EF7BB67AD5C94A -:151F2C00D7F7C04F47786213DBD3D0314F00DB82F349E4A3F77A -:151F4100A598EA1DE5FC20DCA2DB2AF09DCC4377C446779BA8EC -:151F5600F7B6ADDE7AA08BF5466DF5DA44BD9FE4E16F7DF2845B -:151F6B008EE3EA1CE3F16F74F403B5789E06F83BCC746798AD4C -:151F800015F7FE1DF04A0619AFB5365EDB05EEF7F3F03A6EE3A1 -:151F95006197A8F78F7978BD60ABB75BD4FBD7AFE035BA39C326 -:151FAA006BFDD7F05A6FE33529700F6C9ECE6B7C7386875F8943 -:151FBF007A439BAFD19F9B33FD59738DFEACB1D1BD68F5671EA7 -:151FD400BA2336BA13567F5E836E77038EAFB328031AB6D3C5F7 -:151FE900F68AFB3F106EE9FC7EA87F84C4D23ADFE0E43A7FD59C -:151FFE00C1755E6FC8D00E3B39ED8E86AFA00D741B045D8B5E7B -:1520130083AD9D0D02474F7E1C14C7ACB516ADE6DA3C3C4FF630 -:152028005AC6DEB1F18CE771E5E394F92FBCB7473E4D31CE73E4 -:15203D00157569FB206E94C197C9F5EF6A0B8C33DA41DCA3B7F4 -:15205200D9A01F40BBF2D91EEB3B9F23A61ED18755D417BEF704 -:15206700774085F9EA1E9C9FAE67B832BEE12EC055007E216DFF -:15207C005743C3AA6B438CD954664F2D7FA1A33D8D317B2AD7C5 -:1520910001FF60471DB6F7ACF61663BE4EBFEA5848B514E65951 -:1520A600E0BAEF659EFBC57D5382D3A7C29E86FB786C07BE8FF4 -:1520BB00B765909DE791C3BA46D12F4586C12FBDADB9A2670C99 -:1520D000F44D79FDC98F32F33B9ECFD0A9F970BB1AD712C4FFBC -:1520E500A9546A5EEE5C8FAF47B2FD70B3640AECAB1BC656B88C -:1520FA00D4A0A18E36B4C5AE426E93252BCEC6F32DBF4BA57368 -:15210F003F9529969F39DF9E372855F27B70545B3DBC8028B73B -:152124001EFA84C30A9EA11AA188E7093C4355E6C0DBD558FC4D -:15213900EB284E3462F92DA141ED96D0DBA8336615D6C19800DF -:15214E00F3A901EEDB1A3333FFDFD618ECCF6218A3101F4D680E -:15216300FCFBB7D1A77B0B3C1DDA7BBFCDF0E49F6271928DA775 -:152178008451454EAEF1298E80451BEF02BA83D18C52ACEFBB81 -:15218D00F50B33FDBEEE8B349DE492936B0BD2795F309F147980 -:1521A200F8C8D7FC5B3127A28F9AEC2C5729CB19BA17C5217371 -:1521B7005CBC6E9CA2FCC12D9AB2BC17FAFA347CD36B4ACA69E7 -:1521CC00B3D1164F5E7C84906714E79AB30E316FCD43E7218C26 -:1521E1005DF2E2F69B4EF94DC07DD620B4CF94A2EF9A986F8196 -:1521F600EB9F69DF8DF38A42317E11EFB7C57D14A20CFFE7B9AD -:15220B00EF83E596A21E4DCC40BE127482E78C5397E0CF65E79A -:1522200003FA1BF945BCBE6082E51BB1BC0FF9A4897CC83F5F73 -:152235008EBC73DD13EBF1150319FD463C138F703CFE298E9FB9 -:15224A00E34D30F9CCFF791775C01C0EEFAFE823C32A9EA3C3D2 -:15225F0098977F9330B14ED63800FCC707ECF7C9F07623FEC926 -:152274004778FB389D78161D6B4D00EB323926B91C6FD9DA6987 -:15228900E23D116C4E63A7993E5F1B32382F1586CCE4526BF06A -:15229E009C8480E112F9A00C1E1EA44F2DC5D8F518CB47B4F334 -:1522B300E07D6D39B5F71DD431257908F7E6A9A5272CC606DB7A -:1522C8007A9874AAECDEA8B0C1E4827C61B904EDA515BA819379 -:1522DD00E4C2A24E8D1EB8533B7F21E526E3036CFEEDC53E92E8 -:1522F2004F6992F22EF545F8F9796BEEB2A070FAFCA9A36E8876 -:15230700CDE7B2E650E327CD7B6F740E15FE4BD3D229CC23ECDB -:15231C0077F2F969B64E711D425E4A845C589F04A33C7F4D1EC1 -:1523310030713E8DFE0CF5097580C94AE773E9A35FA6E6D8F47E -:15234600384B9F59DE7800C63E9D30E6F9028DB87EE2519697DC -:15235B007F88FE14E6E9CF287706AFC098BC2BE965E7B07B1FA4 -:15237000E5F4E38FE2251B0798DE610E97809B083F27E6B551F3 -:152385005137915357C04D841F15E3DDC2FF9EF8E67CCE37023B -:15239A006E22BC55E03F27EA2673EA0AB889F0B502FF3281BF77 -:1523AF0053D4C57AF8BED8666FBA6D65F88E67DBF04C9B0BF426 -:1523C400A8107C95A40C98282F49DEAFA19F092883788676EE70 -:1523D900DC505F9504F3D3F91D135A9132642ED22FADF5557FB6 -:1523EE00A64991D3E66B51E71617CFFB9C373332638D14993002 -:152403002D9D9D09B62D7915D7D13263E0FBE02325766E884EE9 -:152418001B8F627CA5ED0AE2900F0E68BD85832AF23677ABDF7C -:15242D00B4C633D301B409101B3892EFB2FD46FEFD88993B9E8E -:1524420079FE24D08431631F272FDDDCA925FE89AFF3C9C2A6AC -:152457007DDD38D98BB9A2D618E91960392BB2F0A7385696619D -:15246C006E00C41A8FB1B5F7CCDED306C51910E7A9FEF0FD47F0 -:15248100DB78AA2DF83FB0D139F1445819A04E4F17936729E02E -:15249600ABFF2CE377E9E7397E1778C13A44EEC03326265B170D -:1524AB00298E373A0FC6B43ED015796D8CDFCF00B8703D05C6F8 -:1524C000E33C764700F8662CC77BC33087D8F2BFB8BFAA46965F -:1524D500D2420FDEBDD7618CFF3A435BCE1387B8224097AF4988 -:1524EA0098D85F7DE0F7E5B303C6154113FB378B2694BB7268E4 -:1524FF0066B7BFA4B1C1463F6CA3AFE4A12FD9E82FCE43DF7F80 -:1525140083F431BEE8AC0C18162FC8C3D825CEC362A0954B5FF5 -:152529003E3BC46829910103EF4082B9B789B18FA4F03B8F16DC -:15253E004706E861887BD0A74DD9E31C5C7393FD66679DA1E108 -:152553005D60532FFAABD87E5FC96D2BFC75CD41E54F2A2AB7BB -:152568002A0FFEF1A60794CDDFDBD9DEF2EC4E6553CBB696A616 -:15257D009D2D41A5FAF107B7EF686968DDFEDDEFB4B63F5EBE5C -:15259200F2EE9501A5E4999DAD4FEFD8B1FDB9C79B9E6F0AADAF -:1525A7005A55B9EAEE157F7497F2D4D3DB5A762A81CAB255156B -:1525BC006595ABE125581E0896DFADF8D3FB5B16BDB2B2E696EB -:1525D100B6EDED654F6E7FB6ADACA9B9A96DE70B65CF363DFDA7 -:1525E6005CD9CE1D4F96B5EC6C2B7BEA85B2A6A66D0CB66DFB24 -:1525FB00F6B6953B6F5B758F72A7D2D2FC74BBD2DCF254D3775B -:15261000B7B52B4FB6363DF79D16A564577BCBAEF61548E5FA76 -:15262500F037EF78FAF9961D654F41B31E6F6A7FF6F1E61DCF95 -:15263A00AF7CF2B67B2AAE853F8D9E9D679AE30B37EE67F71A4D -:15264F00F88DB9BE8AC612A59CAEC4B35CD6398D88B406EFD1B8 -:1526640038143AD25640FA8DC6DFA7D2E7341A958DE627BF703B -:15267900AC91E48735BF526DF861EC7D0CB6C40BCF37D176E26F -:15268E003E09DD6FB47E9172FF74A9146C50866829942D22C3C6 -:1526A3005521A587B2F2B0B4370030B4376B6D30AC27830F04B5 -:1526B8009C66B752B4CEF2090BC036CE203C96C0FF5701F73E78 -:1526CD00F9E5368C13CFFD756A16F2653FD7603FD310BDC2F71F -:1526E200CABA58FD12A31FEA13F9B2E9856FCE027D3B4FB48D99 -:1526F700B0B3D32B1D642EF2877C78959314DB3003E6A998E3FD -:15270C0046C657E03EA9D7577DA7866DEF02393A7F52A9E1B5D5 -:152721006A7EC0C5D7AB0E1961E58746CD08D08678CA0BDF5BC8 -:1527360074F01C97B77A850630D34EF3A1548AD1EC62FD72CC9E -:15274B003C9D4ACDC1FBC4F8BA738F7113F805C439F916AEE733 -:152760000700768CF1E5047F7908F90AEFC775B9F956BF5967CC -:152775006CA2BFC3BEBBCCFA0EF7571405C69DDC957029F7980F -:15278A00CEEAE3D0DF07186E1C8738068B94D7CCD22F1D6BED4A -:15279F00EBBF28734BDEF67EA87927E5FAAAF2D27752B3ECFD49 -:1527B40081FCC8C08FD7D65F6D1197114DFEEC556C93121D4848 -:1527C900CCC13BE7E8622314ED4890E2B6464F926CF14697828B -:1527DE003F3EC7EEC3F3F96AA1ED0F18787F29CE1DDF9470BE3A -:1527F300A41A18D348EF3FA3E11D51F5B8CF12C6B3DB611693D4 -:15280800F6EA41D50C55AEDBA414ACFBD079D1F0856E67EB8DA0 -:15281D00462235EB23B12F128AF6D09BB2F4A01EF3BFE763BD01 -:1528320066A8773ABDAF1231F07EEE40B49A12F915EA666D83D9 -:15284700793795F63ADCEB35DC4767F617BEDFE3C0F58C8BFC2C -:15285C00CEAAE601889DCB204E78925E29242ECFD880F69872A0 -:152871007370AE72F3AA3796CE0FBEBAECD6E018C091DED4894A -:15288600D4AC658A23C8F8917B0C5C7376C1383C0F7A9FDE0F44 -:15289B001B3FC6FDF1F831F32F1696A86C7D186CE4D142116F97 -:1528B000290EB6761A075C565DAB5E3BD4395837A0E29DA7C812 -:1528C5002FAEE7E6D2C2F18BDFB7C2F7EF39385FB8A679E10D71 -:1528DA001C3F7BE9E2A241CDFBDF47282A4A6D14CFB45F64E72D -:1528EF00E7CCD0EB6A1FE05D5454AADD8577C28E47D55272D174 -:15290400E80C9D68C33D2E05FBA96E8566429FA0AE38770F1B8D -:15291900B8B71FC4F58EF08F791F88B18B31B4C4E6610AF015FA -:15292E006A64FC877F6C8E4DA5DCA70B783BD7439FAECDD37719 -:15294300308F9E9FDBA6DEA914CBE9403CEDE2FB4530C69CE3B3 -:152958003A8C83FD4601CC4B42C923863196725BDFCE80B1811F -:15296D0036F0AC903BEEA7A22CC22007AB4E3F94B1F7F1970D63 -:15298200CCA762FB8F50A7F48D6CD95F0539E6E315C7ED82680B -:1529970007F57FCE653E359CFD1D933FEA33B305FB0D4BD6BDC7 -:1529AC0020EBDAE88079F5B8F0F9F676A34E8A761FFD0D6F378E -:1529C100F63DE2DB05F84A599F458C5D2C6E133AFA2BAEA378CF -:1529D6007EDA51F780867B86DFB2F450F40997670657E8379C5D -:1529EB00E736D00DE083E9C6A2A2B59AEF178EA0A523783CBFC9 -:152A00008DEFB30A1D39A3625CB78C9C5987FAE1AD4C30BD3021 -:152A1500F565AAEBFD214D025BBB4CE8035F0FC8EEFF1190B788 -:152A2A004F3EC6E29DD9A01F5EB0BF577E2DE46E8D0BDB37B8AA -:152A3F00679D4FEE2B717C437D94FD343A30AE7A218EAC17FDA3 -:152A54003EC3A623EDA023AD1F701D71809C25A123E597B99C53 -:152A690059EE01F6FFF14C3F223E4FB84D6BFDB7B672B0676627 -:152A7E0049B4CEF447FFA7BDEF8F8EE2B8F3AC1EF54833D22015 -:152A93005AC3CC20B0905A443892A33833625024598481B05E2D -:152AA8009910769673B2DD92B0C7B1BD109B64B93B6E1FEF85E7 -:152ABD00C42318890137B8E913589615337224AF7C0B398507C9 -:152AD200397C4F24E2C239B021DC2C211C9764F1388FD8BAACE3 -:152AE700CF283E62E3C466EEFBA9EE1E8D846CECDDBDF7EE8F21 -:152AFC009B7EF3BAEBF7B7BEDF6F557DABEA5BDF5A69AC4D3DC0 -:152B110064AC4ED519D4075AF65353DC2E34E6371EB9869F2B10 -:152B26000ACEB2EE45FDB55654BA5B0DDE817DA2914EC869824F -:152B3B007B50C5FAD98475AE1E32F7037C3D69949F0DE4EB5DA3 -:152B5000B09131CED8A10527686E3ACCD7BEA454B701BDC4D514 -:152B6500A9935CDE8BA786C193F324B9DB582D9F34747AFBF5F8 -:152B7A0011F5B46C86B3EA61EDEA07C8832E36E6FE07F17305BB -:152B8F005F77BC253C273C2C7C56F00937D8AFD97F633F64DFE9 -:152BA40063C3EC5966B0DD6C07DBCEFE9A6D618FB38DEC61F62A -:152BB90020EB600AFB125BCFFE8C7D917D81B5B17BD96AB68A61 -:152BCE00AD642BD8729A41B6B066D6C41AD93216664B59030BD8 -:152BE300B120FB0CBB9B7D9AD5D3F3297617ABA3A7967D929E0F -:152BF8003BD9127A6AE8F9043D8BE9A9A647A6A78A3F95F42CC7 -:152C0D00E24F057FEEE0CF42EB59C09F72EB999F7B02D6E3CFE1 -:152C22003DBEBC675EDEE39DF694CD78A45B9EB9B73CA5B33E15 -:152C3700733EF0F17CE85372DBA7F8233FEEDB3E2E6E3B338E52 -:152C4C00F3B1C15A4DE6674B4856A96CEA8C32F928FC6AC84FD6 -:152C6100B7BE6BE93B6D7DD7D3B724D037FA96CA5A8A1FD17442 -:152C7600D6A6A569522C098A26C98B8F4A31FAA7E89F597C1419 -:152C8B00E598B6496BB90D3659B6FCDC969F407E31CBAFD8F202 -:152CA00073905FCAF22BB1FC0AC80FF95199FC2CAAC4A2412BC1 -:152CB5002FE8F906AD3CA0D71BB4D2428F374869A202F66465D7 -:152CCA002D880E49BE4BA3D975BF93E469F845B99D8790EE4D6B -:152CDF00090DAE3375D4FEABFB5D679A558E9F0F091BFD90302C -:152CF4006E7F87C24A298CFC0DF88B679B555E76BACEB07167CF -:152D0900E31CF5485B30EA2F719AE8329F770775CCF318EAC994 -:152D1E00D3043B815FE0507298F1E3A7AC70EA135BE5C5866EE7 -:152D3300E593FA2FA67F94E245D15F4A8B0DD105BBA3B3BFA3AF -:152D4800C2549C74DEB7E498FAD62D7F8EFFF1EC5CE82698E770 -:152D5D00F7656DD2B4C76AEA6D705D4699EB74145ADFFC9CB4E6 -:152D720083788DD11C34D8447DA783251C4D4611ECA1469AD5B9 -:152D8700C9EA66BE1E37F943E732E0046EAC898E533A0F6B8218 -:152D9C004EB4514FB8A08E5673C90D4611BB8B60BFCB700622DC -:152DB1009DE959FC24C1F463F25B06FADADA996B124159E77EE0 -:152DC600E0EF029CCB151A44A29914EF6A10313F96AAF537A019 -:152DDB003B2F85A8C826BD9EAF3BC17E6C33D7C9803BEA28A727 -:152DF00032EA74942F9E2957A5785D186F57BCAE01EF28EA9AFF -:152E05000E72191A71391FC3DE6230A8C5799B68D2225CD728D1 -:152E1A0002FF58766E1BC58972FB879095CD33CF312DC2F5F20E -:152E2F0037F133A82CB8C53C03CDB659F714242D5D08ACEBCEA1 -:152E440025A012345F49E83A4B28D8DF81FBAD15E23296DEA113 -:152E59007B64B1814577C2AE9C8BA565DDB4FF6AEA31D5670A9B -:152E6E001A789E941F5F47C277B4574F2E882B42AA17DF464EDC -:152E8300CF23FA5FFB50BF0AF9A02ECA670DA62768DE242EFB76 -:152E9800EE83DFA5FC5FEE833FFCEAC9AF7F865F39F9F5CCF080 -:152EAD00DBBA82E0925EEBFBFA83AF874860D63CF2157D1B3BFC -:152EC200A355AC7C5D6DAF7A25F46CD3045FB75814BF44F57999 -:152ED7004A5BB4F2BCEABA4FE336CACB2DBBF3934F88CBC4D496 -:152EEC0090EEA0F15196BFDFC7F4EB862B69DAE3E476D4C70FBC -:152F01003406307FA2F298FEB7C61DC2EB2AF051CC5E098D3CFA -:152F1600F86623C142B4BD42F09DD7056D9FFAEC86D7B43B22A6 -:152F2B005486B4CF20DCC56FAE581D72ED46F93B47D94821CDB2 -:152F4000E3BE33EA725DA3F05DFDAEB6D7C9FFE97ED3FD3796FB -:152F5500FB3FF59FC966FD7DF679C0E8CFFB128E333AF0B68DCF -:152F6A008D6BF11F14367CEB5B850DD07FE84F3FAB2CBCF0B4B0 -:152F7F005270FEA2BA865D0A2D1C3FA9422748F8C900F4F5CCDC -:152F94003A120D70EED52FFD07F5FA43578C85C2CB14E792E1D4 -:152FA9008A1F69C4BC15F94F3E745E77A50A1B469F285CC6F5AF -:152FBE00645FE26BDE47138E14D1FAB88E7AFCE1507738708AB3 -:152FD300F2977EA3A12E12608EFE68D485FD1069D75189C3FEC9 -:152FE800E3A3AF513B2C96F726B3244F16C9DDF1FD714D11D6BF -:152FFD0069D44E7FAEC36E288D00EC2917F610B4E464F5EF0D02 -:153012008ABBE74DB97E5994E26F8FAD6EE0EBAF05E6594D31D5 -:15302700F56DEA279D0DB1F1C30D4C3FAE4F82FFB0BE47E1EB7B -:15303C00C95F4C1D211EEAE6F6486A2D7B41BCBDE97BB9DDF0EB -:153051005ADED648AE4DEDA5B616D744A2ABC4B430DE2EA635C4 -:15306600E08D3D3257EA00EC1D733BA2E5A9842EB85EC63C93F4 -:15307B00DB0B052FA28DB8CE216CC88842EE4E258CBBE21AF7B7 -:153090007FEF27541EB921134ED2D4D013131BCA486E445B997A -:1530A500AC1E321606529D63379DCB0897C6E9F7B22E89E06916 -:1530BA00A5322EA16D05FB349DFAE156CA97A5068C8BBC7E4946 -:1530CF009DDAA91424C0DEEED6C24C3F053BDAA3E82F7747CE85 -:1530E4002BBF7EB4B0A18F752B7DF1034AE91271595F64AF3217 -:1530F9003FD1ABEEDFA929FB9B2F73D952CA1CEC5BB3A4F2B3DC -:15310E007C8F28181FC5DA6BD9A204F600F58A14AF8FB986EDC6 -:1531230032EDF5E3BB4D24193AF39A2EB411EFEAA78DFDE39A1A -:1531380082F541576A80D2ED028EF95E5E79E6A0519179CEA8B5 -:15314D0025BC54503D338524165038DA67ADBC8BDB6EE1794811 -:153162009A7191E6A1E5F2533AB7B1B841D3289D8EBE418C1DA2 -:15317700D3C3991F50DC5DD4467A699C1B509167762EF4786000 -:15318C004B80BAFC7327D583F15EC5BBB257756843AA6B7CB87A -:1531A10011E7E87DA78E98F6BC4F33B6003A00D029A39FB8AE2A -:1531B60047A57AF73BD6ED53134579776CA4B1D69FD4BEF10F46 -:1531CB00E28F0F0A9C667C0FC4977981EB03F25B806033057EB2 -:1531E0002CC1F5B78013733F24C9F7438CF15EA53CD3D317CC90 -:1531F500BC9092566ABC0F2958ABA9A2AC191E17F6B807B4DAA8 -:15320A00C881469CF3F277116FD1BCB63C0EF7712360B985B33F -:15321F0003AA392E1C307C194F03FCB0B6EFCAED8FF4F13D009A -:15323400077097EED56B389DCCF3C9021BD1A0476D9E4B1EE5BE -:153249007DE9AF282F612DFAB214A7AF903CA20616751B4F47B0 -:15325E00CC73AC584B17BEA071BBBA12A7B3693B5AE23CFF9D4E -:15327300A35761D392EA8DF56831437D5BFA3AA7435946C4B92C -:15328800E57980A79CDB5F4A76DA773430FD4903F6C100A7902A -:15329D00F986569B9917CAEFFBD1E783BEBCDFCFF5F9D4FF6FB5 -:1532B2002A6CF765DEC638C06DAB48991EE3B1F7B37EDFFBE0EC -:1532C700779306C0B12FB34F7768BD6A598BB9E7EFA07E03F7AF -:1532DC00DE7858EF520FF1D042D61B02FDCE7D798A77CF59B649 -:1532F1007F2F73DDAF894ECE7B4437B845BEDF11E7FB58A037C4 -:15330600E8CB6D5EA19D133D67D292E3DEA2C3ED70FB9169045F -:15331B001AE4E3DEA6C7C7A04131A7419FB5CF33458BDBD220BD -:153330006FECB5F11F1B87BDB4D2603E2DBCB14F86605F8345EF -:15334500BB466F3CF1C946295644E36C972E901FFAB1CDDF28C2 -:15335A006C38F147FB3CA0D99F9413ADBC8B3443A03A8176A8A8 -:15336F00A3B9E7639681F290B77DBE7D4A7E32E9B1208F16DB67 -:15338400393C49D3EE0E85635F51CAEC3304EBBE1BB8953CFDD8 -:15339900E3AD79E9B77E39A7E7CBF583FBD830D7DBDC049A7748 -:1533AE000D2B1ED9C9FBE92D5C0F50D31744CCBE29D7EEA8CE2A -:1533C300C2268CCBF4BEEF3CC701B553DFB63F98F5CDCCB8F661 -:1533D8000BF6DCCB03C9CE052413C82C7534C8C68F4658E668BC -:1533ED00F93F66DDF41E25F728F98F3659E93F28BE32313DBE77 -:15340200CB8A8F717EE0EDBC32B1DF48F391FCB4A80F9F7B51F9 -:153417007D6E92FCD28AF573792CFED499934A2189F6A2DC9BBD -:15342C00849D9A62F97412679ECDFDA0717EE651928FD13C2606 -:15344100A17B324B1A4E1FC8BA81878167B3EE9979E6C3C6F7CB -:1534560031296DABFC8C7EFD558D64259C19485A7CF8EF0DCEEC -:15346B00BB416EB37E723FC98F0D241F7D1CDE9C7CB5574F3836 -:15348000481E1D11DB275FD58C84A3CF6895F71B6FDF44FB88C7 -:153495005B73952EE32A6422A23FF657652A231F2737AE4CC7E0 -:1534AA0027F6772DF9D6D47FD60774C8D202B52FD491DC46F8DA -:1534BF00DF91FC188C72BBDF763E727A2A1FDFEFB3AE0A9CED31 -:1534D4000994C32EB47E91CADC06BBF91968DC46344FA6562FE1 -:1534E9003C15527F10AF0B753735F13EAB88D1DC287D9F562434 -:1534FE003C4C7DCB9A19B2A6639928DFA7CB99681FEC1CBB5C2A -:15351300D514DE66C9998B1B8B694EE3A8547859B08B0879DDE3 -:15352800D915524B23A17031953D54754F634546A631B3562FB7 -:15353D00CF0475C1D3A2767F3BA439C769FE986E326C7BD4D0FD -:1535520001E132BFD445F2674D4874134CD1AF8C32FDA17E5706 -:1535670012FB88FF9ABF332B1CCB6ED5BF29B7F4306AAD7E2D55 -:15357C0048FD5A9302B9DF2B0B413E9709364DD94049BF30BA8B -:15359100607C405D60DD59E0A3711C63314BBF64940957D55FDC -:1535A60057977E96914CCED88426B1DF34FA846B6A69B5B301F8 -:1535BB0072648464F60A6158D593DD4A39E618D46FA29F14DD49 -:1535D000AF73FB344CDA31FA00FBEF212ECBC1760CB91792FC9F -:1535E5008DB7FD5F2817B5E7DC83669A8FF23F9CCD06642ABF7B -:1535FA00D1CA9FDBF69F257FFB1F4F4DE57DA7FCA73C0DEC3F98 -:15360F0049B566F92E8259B6E250BF1E58287F32945F1FF84BF5 -:15362400DC864D11CDA95ED259E685A33E6AE7C998735945E6DD -:15363900A08EFE14BC8A7DF5329219DA16F42E8D903C8631F194 -:15364E004B4E9DCB608DCF68215BEEDAF47EF603E52ECFBBD91D -:153663000F94BB9A6691BB1CE78EA890BD206FD9F2574EEE8AAB -:153678000C37E28CBB6F25CEBABFAE35DD9CDE1FF23E9368DB97 -:15368D0056FD686331D7C99ED03CEC64A3EFD4FF22584E6A8B1D -:1536A200334B7278704D38DB6D3CC006D104E1E9DECC1C93BEB6 -:1536B700382B6386EB62F2B87A37A1A1006E2B0C7E080B4085CD -:1536CC006486DF091AAF3E088F243B841D6DD7D41BEF645DC0D6 -:1536E1002770566FE1B0E63D138715B3E010694EBFF32F8B4708 -:1536F6003FE457C2E3A2C089CECBC063747F5FECF733AE95B49A -:15370B007065F3FFEDDCF2CCF4D103FA1AD6A7DD4FF39DEFFF58 -:15372000AC77A92C9F1AA5514CF30A24A74A970C9FD54E45E8FD -:153735005348BF34B6B1CB5A99F0867AC7CA6BEA216A87341F91 -:15374A006FC01AB85466A898FBB2F401CD357E90DE07B53B5395 -:15375F00628397E6805EF6BAEA3D754515F8BD15A3DCBE14B79D -:15377400AFF4438C1B716D60FC07E13B28DE1D142F30DE13B21D -:153789006D3F4994066D54A638B63F6C3FC11FEDAB32736F4889 -:15379E009A28E434E736A7CE5EE16D0AF76905327786A6EC5777 -:1537B3005DE1FD43F0D5D2507EF9F2AB81696EE9D5CA696EE8E9 -:1537C8005BCDA7B2E673B8BAF3E03A990757771E5C272DB8FEA1 -:1537DD0084E072E6C175320FAE25A19976B582164FE7E0CAF8FC -:1537F200A7C3955934CD0D9EA9A0B1B531833E90DF11C9F8DC00 -:153807004700EF8C111DC61AE711CFCC3F457C263F63283769B9 -:15381C009E9E7E5E0F73FB865D7DF192443BDCDBF85D55C7FA7E -:15383100A00F5570866091BBFA1DE7BECD797284AFDD3CAF0766 -:15384600E5471BCDB897B5EB2B8A96791E7885E629BFD45DF29A -:15385B00F7FAEBE5FF61C47F37939F7A463DD07F4CADD7CC6F34 -:15387000CCF37B46275698F98C52BE3E2BCF1B2B3636DECDFE86 -:15388500A681CFD3F3E2222DF2C84F778EE2EC78F2921294FFC4 -:15389A006229FC21BFD134EECFF0FD0C64B8684F0AF323A42D33 -:1538AF00C6990FE25D9C27ACD8FF3CE763F4AFA2957FE9B4EFA6 -:1538C400F92187F9DD572CCF0DD15B7770BD769DE7EF786E8FEB -:1538D900CA714CF3761FC9FF46E405458A24D472C23F3FDF2953 -:1538EE009936FF6FF72799272924D7ABD85767D24E2E1749FE99 -:15390300B862CB455C4642D8C7908F6CD9C8929366958F201BEC -:1539180041460A731B30391947D3CF99328E598ECCCAE5DF195D -:15392D00F320EB92DCE492771B23D7B2AEE294962C26B8C3914D -:153942004483BD76514E7216E224AF8166DD3AAB15DBB75F33B8 -:15395700E5AEF11FF3701DE141C20FD2B3D4555D583041E3BBD3 -:15396C00466D21A915A612712F9523A58EF5A19F04DF214FCC1D -:15398100DFC17FB5F2ABFDE6BC7E265FF7F2FE653EC9C5DE53D5 -:153996007B492619D3C08315046BEB1FF3E55FAB8E54B7792958 -:1539AB00677BE6CDACBF96E4DD6DBF356556BE1741F09D79D3A5 -:1539C0004C531630CF6FB9ACFDDFD1F9CC4D7329F7C83CD38DB4 -:1539D500F3A3DB1DCC7D86FEE6FCB0D6B28F62EA383953423B4C -:1539EA00F33569F6D962CF4F894F4E35ABAB683EE6EC1A547BD6 -:1539FF00D3834AA5EC6C59287FFA73580BE669A43A35771E3916 -:153A14005A4D7C24F488B16ADD29615D59E879E3505D985DEFCD -:153A2900D2B6FC149750CD9C0F4D2F7F55BC6EE93FAB9C5BF459 -:153A3E00C7829D35F35989242D56A12F0E5D0DD843724A7FCB73 -:153A5300F57BEF4ABDDF0ADDBFC03743E8C3B84E1FB761111D23 -:153A680036D6523CBB3CF8B7927BEACE013E472F96024D9DA766 -:153A7D0003B0AF54DBF95E00F936987A72E5ACC4131BA4B1734E -:153A9200897AA72C34632FD513AB366E90BFF8CD2EDDD4AB1599 -:153AA7007B2E5AF32BA7B443FD1585C13E682FE250BDB0372D1B -:153ABC0043F78FFCC4D8A031067FFA7EA390B92F5BE98AC87D98 -:153AD10095FCF11E221AC35ED698C33CB3DB0B9AFB26614796E4 -:153AE600158DC02EE7354DBAF08C02BDEC729C75938E692ECFE7 -:153AFB0011751DD1769E2CB6176506349CF3A8A07E349041FC40 -:153B1000BD3B30C60996EDC0BB52AD4B258F797608B675E6F2B3 -:153B25003C87FB711F93CB8CE32B4F894B85915BD3B26811D7DC -:153B3A00D7D6096F61BF797616FA59B09B0A3D948C1F77C324AA -:153B4F0072F73188F2756333D14D24BC78A82DC7E89BCDB21F0F -:153B64001B8CB9B458E6C747C52B5DEA7B3E3BDF8A5CBE492BCA -:153B7900DF98653B7B0FF52D63458C9F1966E9B8C1F793A4B0E2 -:153B8E00265436758A995AC395811FD12AD3C4CB2FCF4C92FB54 -:153BA3004CA79449519EB14EACB3EF59B049E17D5BE596CE8A23 -:153BB8000C6C185CEE14E5AF196301933F6A284D6D26DD5F4F2A -:153BCD00E9C3945FEB3CE60E527A13B63FE9036CB0B3BC0A7361 -:153BE20028669F5B8E744632EF187B16449508CF53E98C929B8F -:153BF700E21F5D4DEF18E55D4873DAFB33878C48E6E9BEB68CD8 -:153C0C00DE1FA537F6A8A3F43D4EE10A9595F65AB6C4598AE365 -:153C210000F64B61F3B13393321EA17C63049B0FFC4AB8AAA7B5 -:153C3600B78BDEB0D12B5378057DAFA63C7CF4AEA1F9DA26FA1D -:153C4B009E9807DE265C915F1BF989D4D75C24BF60C0A4476CD9 -:153C6000864D72E795B84A7C57E295C5E50579F412008F3C64E5 -:153C7500604D35280F515F3764CC464FF33C53588B3A58C9DDD8 -:153C8A00A987C2683785CDB216E53AAD757A39BF43A8CB30756C -:153C9F001D841E3B8F149559D537C8CFB5080BE2EA947DA00895 -:153CB400C50B6B8CF2EB015E7CB5B9BE6DE2EF3106D6A9B8178D -:153CC90061B1DCBE946DFD5DB7F21BC6EC7CD8D62E2DF8736B0E -:153CDE00FF6BEBA0B685BE7B6467BB2B074FB3BE10E310C27EAD -:153CF30063EAC9D7DBFD13F9457F0E5DD365CB5D046B8C997058 -:153D0800DBF4E6772A5AE9026CF972B6B599E76FEB8B230DE54F -:153D1D005552CA5A7918F22A0ADC8A2FB46F9F30759E439A7424 -:153D3200501D4772753C7701753CA2AE8149D46F0EEB9317007C -:153D4700306C5F99FB57F2CF281AFD23F48FD23F46FF2DF48FD5 -:153D5C00D35FA77F8AFEA3F41FFF9919976DED36EB6A9EF9E018 -:153D71006E7D867B74863B3DC33D39C32DBD36DD1D9CE18ECEF0 -:153D8600706F99E1D667B8475FCB3B9342F86913A6DBB78880A5 -:153D9B0076BED19C5DB049AA97BFEBB85ACACF365BF9548E74A6 -:153DB000626D684D6C43D87F7258AFBD083A4DE14D21F726FA49 -:153DC5006FA37F92FE7DF41FA1FF09FA9FA1FF65FA4FD0FFC613 -:153DDA0045332E3B36CCF196B2E94F6EE04DCF73036FF13C37CD -:153DEF00F0B625CF0DBCC5F2DCC05B34CF0DBC45F2DCC05B3084 -:153E0400CF0DBCC9F9E5BF36657F93974F6E7F73CA006F433FFD -:153E19005A7C62C33DB67D048EB3D9EC7F107E3D2C0FBF33E3C5 -:153E2E00FC33C3D1F78C91FC42B2947E7A0E734357B658165B92 -:153E4300FA04E676D137F5332D1E1A238BE5459FBD48E36205B5 -:153E58007D838EA2B44BDD5C467DD65C56F218AB6989CC35FBFF -:153E6D00B407E83B3CD7ECCB2A59CD725BFF49869D72DCFB4582 -:153E820079006793A5347E53FA8952C80E2F4ED9E92019F152A8 -:153E970055178DCB872123E8932B9CCB4F531CB96CF6F1C91EC9 -:153EAC00E7B0378FF1689299363AEC781E2A77A7659780E49DE9 -:153EC100E597292F3797F7A7F7631504EF7609E321E48BDDFA81 -:153ED6009E18CEA5BDA8EF881CE6F5777FC6D92EC9753AFA7C2A -:153EEB009C112A5B79006BB9DA9639D89F1AD499FEA2EE178621 -:153F0000D516D6CDE377BB87156141138DAD83460DD54D243929 -:153F150097DB268FEED52ECEC538A6774A65499EC7988764486F -:153F2A004AE3925FD4451A8BDDA558571EA4BEFC450378AE91FA -:153F3F004CF903B0A63DD3E5BB9139ACE434E5979A8371A6469B -:153F54004FF0B1A9968F4D380F2B2C08727B0A976F66DDC5F1B1 -:153F6900AE1667B45695E56AFD8D15C2F2CD94E6CC5C5326B23D -:153F7E00F1E0B5740FA7F477653D4EBC29A57772BB7EC85FBA96 -:153F9300F02905E78C00B33732B854245945A43C2729CF769297 -:153FA800A9708E49E4BAD87C1C862D490379A0BD8BB161C323AE -:153FBD009BF7BA66B91EFF8B9A9FFA7C51FE9E81F8B8FB976419 -:153FD200B00D1305243FE3CEC7BCFBA71294C7DFC588F762B02A -:153FE700B561DA75FFCF6CB0C5436E8C33C065A498B9DF269E84 -:153FFC007D8B75B5D8B09B3819E17D13F2E0677ED892161BEE59 -:15401100EB0437F45D890E25B02303DE100907176F64DDF6BD19 -:1540260005F9750AE4D5C91E6F502FAEB740FD1DE0728ED39C6C -:15403B00233AA6F13A4883FD34F7A07AEF9EB2731CEBD27ADD53 -:15405000CCBD8660B5D37C2ED2DD029D8B9F1CF9E5618F5C6F8D -:15406500F8B9AEB24A6D76B561C32ECA87F9BC0DDF18E3250BE4 -:15407A00476B2D386D3D4E0B977EEC15D7539837262EF7154C5C -:15408F00B50DC95DA39AF7EBF6F1F28C5343CB59380C1D8CAC5D -:1540A400B96796CD7EEB5498FC123AEE46294B3FA9965DB84765 -:1540B900914EAD542B65472BD7C94EEF864E94DB9D3F6E5A70DC -:1540CE0036B0257C5C1E7531F715AAE32F88F7D8D6E7795E88FB -:1540E300EF425F1F1EE2F7AEF0F34BADF5FCDC0EC9E1FA77E3C0 -:1540F800832D38D303FC3E8D7B0B49A6B5F0EEF5669C2DF321EE -:15410D00AF674EEAD71F7C69F92FC88D3A8B99E1D9F98D706485 -:15412200F29BC93F9ECC71FD40C6D91E681DE6E5A19D99F4946F -:15413700394EEDFE5A6C5D82B51884EB95E38361BBBE51613A5F -:15414C005F42CFE6664C6801DC36DEDE1C1FE27D8027467D8299 -:1541610055CE2F288F8F5AA7CA8C7379B0783A2FB6BD9D75AFA9 -:15417600263A7A62797591BFA7439F3257179AC398F5AFCDD556 -:15418B00057088AD9FE675E1788A0D7E209E9C528D6AAD9364C6 -:1541A000515FD7A9FD5C671573A30187D54F100EA84F77E7EEE2 -:1541B5004C487769E7FE68EB0FD7F33A411FDC4EFB08A503BD44 -:1541CA00FB284D7E3FB3ED7D935F3DF2615D8E0D695F8F0C8732 -:1541DF0050367851DA3E669E8B4C0FD37CA11BFB9D567D877409 -:1541F400BBAD88992386E41E56CBA8CF3D48732B4F06FD8A6685 -:15420900D5FFC454FD892FE6B79EE4F59F4F74B3E89B1B438A6B -:15421E00D1DFF1F6A0C1DE7FAE3DDC840D9FF0B169EDE1B7E3CD -:15423300C7B85D1FE0ACE121D35E01CA798EED6D215E36DB49B7 -:154248006BB7C9C7046B4F1C67F0F5CE03B8B3217A7206BD7508 -:15425D0093DE5563CB0D727B624379743DA623CD145D87AC7ADB -:154272002579BDD0E794B5EEE5755A98129783F76D5AE6F89743 -:15428700FCC414EE0A49E83DD4FECC7B42CC7AFC35F1A7CD8B26 -:15429C005E36D6524AE503961B04CB42E2BD6345D379EFDCFF00 -:1542B10026BE93F3E08B117CB13CF8641B3EB35FE2F86CEDE6C9 -:1542C600F0E5F70BF1EBA6CE03DE62CCBC07588F24B694E68D22 -:1542DB0039F1776D5ECACD5DBD2CDCCB710B5B2C7D93D9921C44 -:1542F000EF916CF32B9C55785EBC478A99F36F6FE4B0FA32A58C -:15430500F1578BED6517FA1487C0CAE6212C7D4C972EA414DCF3 -:15431A00F17094609530E610FF6C06AFBA20776A5A2070A253C4 -:15432F00261929FE646FFB0EF827DF411FBEC375EE24D7DB9887 -:15434400A8DABB8CA5C7742328B4239FCAC45ED89CF3CDC7FD16 -:1543590068E49FC07AB5B4D710293FECCD7337952BF23DC1BDA2 -:15436E00064F87B2F4BDD07F9E87BB95BBCC343BE234A7C7BA03 -:15438300886BAD063D0E3FD7A1B3E6F412BF4F604CDFD9A6299D -:1543980005EBAEABF16CD6DBFB794D419D454A539938B201F0C4 -:1543AD0063EC042C80CD4F75692218FC174E28F36354D7B3DF2C -:1543C20056BD4CA33E3CA57C1FE38295A77876402519D88B7446 -:1543D70076DD7B28FFE4BEE3FC1E66F00B8F1B3DB6C3B5FB1DAF -:1543EC003503D8A84EA80BBB3EA0812EC003D34F6AC06723D44E -:154401005C28DCC6C5E51C1ECCB27278C07A6DDAC443E08762E3 -:154416004B721D742486B52EF2EF457B219CC00F6B1B18834D1B -:15442B00784F120E8E28C8BF60DDEFD5ED1C0F479432AA1F70F9 -:1544400020E15C15D5DB853B83A82CD84C0E52F99581894EDBE9 -:154455001EB2699F27AEE9C4837B162495B7D884B628C8FEB2C2 -:15446A0046163F97B3D7F917DC1E32B79BD4C6D70896F49B67EE -:15447F005B933C5D24B30B7756B8E98D7D6023F6EE149FE33C0E -:1544940023D6AAC0A3F5984B439736D8A4E937B89E663F8DB948 -:1544A900E3F15A67BBE00AAB623CA40E10AC55CA28EEB9D475D6 -:1544BE00F9402B9F9F521C89FA0E8FFCC51697FCB51649FED26B -:1544D30072312A63BC1EBF4AF230DE9D984B455FE43695FDCD24 -:1544E800B261E60F9971703C4861F594BE96D2D7507AF855C8F3 -:1544FD005F6AB1F3207E6AF150B88BC2AFAEF81ACFCFC3E766D2 -:15451200BFDB61C7D9827208265FF3A499B76EC20D1C85D136AC -:1545270008CE7AF9D556B1396864281CEB05AD349F1692215583 -:15453C008A630FD88C8FFC8807FC22E58378FC7C020EA4C7CC33 -:15455100FB80D0869B9835BF06CF4B435639239DB02952CE6D45 -:154566004F987E9833C18FEB1B9A67316E992F098249CF9C3FD4 -:15457B00E55F61CF7FB85E2A95CFEF384B195BDEBD75CE659ECD -:154590007D1DD11186FE07772CF8ADFEC69FFE8EEABBF01D0521 -:1545A500F2AAAFF59879AF1085F930F767C731BE6BAFFCB680E3 -:1545BA00558C1F6FDC42E39EC79A67983AB0A69C833B095CF13E -:1545CF00234BE793ECE943BEC111138E5C3F99E4F0F9228930CA -:1545E400B76F426EE4591E196AACC8CB333777A13E97A7B7FA20 -:1545F900CFDF5AFC8C7A606E47B079AFF2359D9AA934F9E76932 -:15460E00F9FDE74F69FF384BBAC333D211BFEBB3AD27453287BE -:15462300B4FF394BFACD1F21FDB559D2856F0BEF216D6296747F -:15463800EFB1DB9737F9FE8CFD27ACEFE4F31FD6FCDF9DBEBE22 -:15464D0031335CFAC38787C76F17FE7F3BFF19E19E7CFEFFB008 -:15466200F581FF1FFE4F0A97F2F0EF9DD92FFD3F03BFC51FD198 -:154677008F971EED6B9E287359ECCBDC46536D67B7147B641541 -:15468C0035454FD9A3AA46E1B82BDA73EF6E15ED14E3A4A76CC6 -:1546A100933A67F56E55961FD7E6DCDBA5FAD6698A47A8567DC5 -:1546B600A5D56A82E416AB4D6FB84163B35456AB22BF7F6A5E9C -:1546CB0087EED314EC110BEB30778969D0A813E582F6AF539F69 -:1546E000ECF754ABC5EBEAD5E7EEAB53AAD6D52901CF236A774F -:1546F500C1A714DCC5B8488CD973151FE28BC22754BEF6B0BABF -:15470A008BF71DE843AA4A130AF413ED702F0FAF539D65712E7A -:15471F00DF553D1057F9FE1264E459605865C15042301C22180D -:15473400FC79E5A3DC4A8201F178BE947F7ED937AC7C27F3F2CE -:15474900CD665FC97A60EB20C4DAD7331640DEF18298067C644E -:15475E009999D7DD8CCD9B4FB8F15099EEB57584A36A6591A745 -:154773005EADF88CD8EE645D1D557F25B61F9A9BE034C0BA4825 -:1547880090E0C01EDC5DDC76DA14EC5EAE07833DB8F813BC6EA9 -:15479D0004D3390BA631D4DD73BF5AB56FBD2A94DAB0656FDA01 -:1547B200B0B5106CE59E6AEE1F2701D1A697BBB45EF5709876A1 -:1547C7002B8B4A13EAFE9D7B72BC003CFF219BB56060BC9EB026 -:1547DC000966EE374F3E8172D3161CB81FEC0C7DCFD54C18CA91 -:1547F100F6D5A865541EEAD66E9D4D81D226C74BD1145EAA8851 -:15480600774AD6B6AAFE75610ECFAE82DD4A31E1A5C493500B35 -:15481B0059A2638FC59B8B79DDA7CA9DA0B2740A2B237C11DDC4 -:15483000BD360CA07D55DBFD0A64A1AA75F72B33E94F8DA8AC8E -:1548450098EF1B4CB5A7AA33033C9E70BE5EF53F105345F6B844 -:15485A003A87E23E27B080D3FA36E8BB641DC149FC52521A56D0 -:15486F00B51F352B87CE362B25E7D7AA7E8DFCF6AD56B5CFAF8A -:1548840021DE5FA38007FC84D3AAB5262EC498D02EB34D9CB7E4 -:15489900494EF3398587544FAC0077EBF8DCD8ABA96CEB9C2374 -:1548AE003CAC7AC455AA67259577EF63AA67F51A756FC12A05F2 -:1548C300FA1EE2CAA9F84501F31C188F9F0899F15FFEAAEA3924 -:1548D800DDACEEDD19529C34EE96FDE811A5EA3305EDB0BDEDB4 -:1548ED008A873ADCE3CD1D07610F4D0BA955E71F528573CDAA2E -:15490200467105D7142DB6A28D07F8B9B10DB005E4EAA274A731 -:154917009A3BF85CAF89B51796053B8ACA9A3AAA92EB955DD473 -:15492C0037C8E4DF43EFBF449FF3F71B554F4FB30AB95A961F63 -:15494100866CE7F224BEAA0A6B1F5779D8CBCD141E52F712CEDB -:15495600407FF038E624C5FF5168AF3A4F38D4BA54FFF9AFAA3B -:15496B0025E776731ED84F3C3087685F1CD13AF2FB25D01DB469 -:15498000E33AF5164DC193F7122CED809FF08CBB49D7D177A2D7 -:1549950060B33287CA01FCDD3BCDEF5537B37EF44BB61B7169FF -:1549AA006CD83090C51A8EC9DB064DAD803FF47B34E79A67F3A6 -:1549BF00D5368AC3CF47100C9B67E80797FDA842A93A574EB8AA -:1549D4002D5767E3A337D9141FFD9A997C041A14131F053C9B2E -:1549E900395E9EB378097CE4D7C86F062FED8EFFF9C6E2C026AC -:1549FE00A24FAC73377B78E39C40B453F03CA6DAEE92C8C31BD2 -:154A130041A7395DEB3BD8D9F60EFB5D75CDC1EF702A8EAFEF25 -:154A280028196FEF10DC44F34F546B4EA2C34DA23DF07737A785 -:154A3D0085A3BD44DB4174788CE8B087F7E9F9B428B0689130FA -:154A5200EF8EF209AE4F50D9D10D67385DC037D10D6333E84242 -:154A670034F13E60D185FA5DEFFA3CBADC994797B7B8CEEF5418 -:154A7C00DBDE49EDBA378F4EDCFE38F100FCB75BB4BA803BFF2F -:154A91002CDA6CFA98F4B894478FBFB3E88136EDB768710B1D40 -:154AA6008836F9B4288A7C65636164FD46B68DB57BC6BFD23197 -:154ABB0047DAD451C4FECDC6E2F8BFEDF08C3FCCDD557FC5DBED -:154AD000ABD7C3C81D799CE35DDC5EAD39A8EFBD5914D58A6DA5 -:154AE500BC533B2DF1ECA4FEEF5FA9256B9F9C86F7E2D9F09E3E -:154AFA005C0C9AE7E13DC6F16ED7371FFFD4E77BEFB5F08F35C1 -:154B0F0011B4131BFFDE3CFC3BF8DA8689DF5E0BBFA5E8A7280A -:154B2400AC92E65AF96DC04EFF261F174C9A211DE8A658743081 -:154B3900711E9E06CBB708CF9E94D0FE32BD13D4F714521EB8D2 -:154B4E00FFFDD0171F51ABD6B52A52C152A5A8E01E053CECA121 -:154B6300BE879D6DEE38F4530A3BBF56F1167C5E71177CC10C75 -:154B7800135675B0FBD674EC8A39DA01D762E084CA261E292BCC -:154B8D00941D7C8C843FECB9D87314940FBBA705F6D86D8D1FA2 -:154BA20088075D7FC0F55A36EBA338B9B6FF32B57D8C5D9768CE -:154BB7003A89F512C80734D6F94E5BF1BF4FDF55D744BCBD27B6 -:154BCC00785E4975BF63E8117EC65230EF62A69125EB8D0C3DF1 -:154BE1006A308DEB88C1DF37B5DE5AFC7F00E871AED038A00037 -:014BF60000BE -:00000001FF diff --git a/drivers/atm/solos-attrlist.c b/drivers/atm/solos-attrlist.c new file mode 100644 index 00000000000..9a676ee3082 --- /dev/null +++ b/drivers/atm/solos-attrlist.c @@ -0,0 +1,82 @@ +SOLOS_ATTR_RO(DriverVersion) +SOLOS_ATTR_RO(APIVersion) +SOLOS_ATTR_RO(FirmwareVersion) +SOLOS_ATTR_RO(Version) +// SOLOS_ATTR_RO(DspVersion) +// SOLOS_ATTR_RO(CommonHandshake) +SOLOS_ATTR_RO(Connected) +SOLOS_ATTR_RO(OperationalMode) +SOLOS_ATTR_RO(State) +SOLOS_ATTR_RO(Watchdog) +SOLOS_ATTR_RO(OperationProgress) +SOLOS_ATTR_RO(LastFailed) +SOLOS_ATTR_RO(TxBitRate) +SOLOS_ATTR_RO(RxBitRate) +// SOLOS_ATTR_RO(DeltACTATPds) +// SOLOS_ATTR_RO(DeltACTATPus) +SOLOS_ATTR_RO(TxATTNDR) +SOLOS_ATTR_RO(RxATTNDR) +SOLOS_ATTR_RO(AnnexType) +SOLOS_ATTR_RO(GeneralFailure) +SOLOS_ATTR_RO(InterleaveDpDn) +SOLOS_ATTR_RO(InterleaveDpUp) +SOLOS_ATTR_RO(RSCorrectedErrorsDn) +SOLOS_ATTR_RO(RSUnCorrectedErrorsDn) +SOLOS_ATTR_RO(RSCorrectedErrorsUp) +SOLOS_ATTR_RO(RSUnCorrectedErrorsUp) +SOLOS_ATTR_RO(InterleaveRDn) +SOLOS_ATTR_RO(InterleaveRUp) +SOLOS_ATTR_RO(BisRDn) +SOLOS_ATTR_RO(BisRUp) +SOLOS_ATTR_RO(INPdown) +SOLOS_ATTR_RO(INPup) +SOLOS_ATTR_RO(ShowtimeStart) +SOLOS_ATTR_RO(ATURVendor) +SOLOS_ATTR_RO(ATUCCountry) +SOLOS_ATTR_RO(ATURANSIRev) +SOLOS_ATTR_RO(ATURANSISTD) +SOLOS_ATTR_RO(ATUCANSIRev) +SOLOS_ATTR_RO(ATUCANSIId) +SOLOS_ATTR_RO(ATUCANSISTD) +SOLOS_ATTR_RO(DataBoost) +SOLOS_ATTR_RO(LocalITUCountryCode) +SOLOS_ATTR_RO(LocalSEF) +SOLOS_ATTR_RO(LocalEndLOS) +SOLOS_ATTR_RO(LocalSNRMargin) +SOLOS_ATTR_RO(LocalLineAttn) +SOLOS_ATTR_RO(RawAttn) +SOLOS_ATTR_RO(LocalTxPower) +SOLOS_ATTR_RO(RemoteTxPower) +SOLOS_ATTR_RO(RemoteSEF) +SOLOS_ATTR_RO(RemoteLOS) +SOLOS_ATTR_RO(RemoteLineAttn) +SOLOS_ATTR_RO(RemoteSNRMargin) +SOLOS_ATTR_RO(LineUpCount) +SOLOS_ATTR_RO(SRACnt) +SOLOS_ATTR_RO(SRACntUp) +SOLOS_ATTR_RO(ProfileStatus) +SOLOS_ATTR_RW(Action) +SOLOS_ATTR_RW(ActivateLine) +SOLOS_ATTR_RO(LineStatus) +SOLOS_ATTR_RW(HostControl) +SOLOS_ATTR_RW(AutoStart) +SOLOS_ATTR_RW(Failsafe) +SOLOS_ATTR_RW(ShowtimeLed) +SOLOS_ATTR_RW(Retrain) +SOLOS_ATTR_RW(Defaults) +SOLOS_ATTR_RW(LineMode) +SOLOS_ATTR_RW(Profile) +SOLOS_ATTR_RW(DetectNoise) +SOLOS_ATTR_RW(BisAForceSNRMarginDn) +SOLOS_ATTR_RW(BisMForceSNRMarginDn) +SOLOS_ATTR_RW(BisAMaxMargin) +SOLOS_ATTR_RW(BisMMaxMargin) +SOLOS_ATTR_RW(AnnexAForceSNRMarginDn) +SOLOS_ATTR_RW(AnnexAMaxMargin) +SOLOS_ATTR_RW(AnnexMMaxMargin) +SOLOS_ATTR_RO(SupportedAnnexes) +SOLOS_ATTR_RO(Status) +SOLOS_ATTR_RO(TotalStart) +SOLOS_ATTR_RO(RecentShowtimeStart) +SOLOS_ATTR_RO(TotalRxBlocks) +SOLOS_ATTR_RO(TotalTxBlocks) diff --git a/drivers/atm/solos-pci.c b/drivers/atm/solos-pci.c new file mode 100644 index 00000000000..943cf0d6aba --- /dev/null +++ b/drivers/atm/solos-pci.c @@ -0,0 +1,1492 @@ +/* + * Driver for the Solos PCI ADSL2+ card, designed to support Linux by + * Traverse Technologies -- http://www.traverse.com.au/ + * Xrio Limited -- http://www.xrio.com/ + * + * + * Copyright © 2008 Traverse Technologies + * Copyright © 2008 Intel Corporation + * + * Authors: Nathan Williams <nathan@traverse.com.au> + * David Woodhouse <dwmw2@infradead.org> + * Treker Chen <treker@xrio.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#define DEBUG +#define VERBOSE_DEBUG + +#include <linux/interrupt.h> +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/errno.h> +#include <linux/ioport.h> +#include <linux/types.h> +#include <linux/pci.h> +#include <linux/atm.h> +#include <linux/atmdev.h> +#include <linux/skbuff.h> +#include <linux/sysfs.h> +#include <linux/device.h> +#include <linux/kobject.h> +#include <linux/firmware.h> +#include <linux/ctype.h> +#include <linux/swab.h> +#include <linux/slab.h> + +#define VERSION "1.04" +#define DRIVER_VERSION 0x01 +#define PTAG "solos-pci" + +#define CONFIG_RAM_SIZE 128 +#define FLAGS_ADDR 0x7C +#define IRQ_EN_ADDR 0x78 +#define FPGA_VER 0x74 +#define IRQ_CLEAR 0x70 +#define WRITE_FLASH 0x6C +#define PORTS 0x68 +#define FLASH_BLOCK 0x64 +#define FLASH_BUSY 0x60 +#define FPGA_MODE 0x5C +#define FLASH_MODE 0x58 +#define GPIO_STATUS 0x54 +#define DRIVER_VER 0x50 +#define TX_DMA_ADDR(port) (0x40 + (4 * (port))) +#define RX_DMA_ADDR(port) (0x30 + (4 * (port))) + +#define DATA_RAM_SIZE 32768 +#define BUF_SIZE 2048 +#define OLD_BUF_SIZE 4096 /* For FPGA versions <= 2*/ +/* Old boards use ATMEL AD45DB161D flash */ +#define ATMEL_FPGA_PAGE 528 /* FPGA flash page size*/ +#define ATMEL_SOLOS_PAGE 512 /* Solos flash page size*/ +#define ATMEL_FPGA_BLOCK (ATMEL_FPGA_PAGE * 8) /* FPGA block size*/ +#define ATMEL_SOLOS_BLOCK (ATMEL_SOLOS_PAGE * 8) /* Solos block size*/ +/* Current boards use M25P/M25PE SPI flash */ +#define SPI_FLASH_BLOCK (256 * 64) + +#define RX_BUF(card, nr) ((card->buffers) + (nr)*(card->buffer_size)*2) +#define TX_BUF(card, nr) ((card->buffers) + (nr)*(card->buffer_size)*2 + (card->buffer_size)) +#define FLASH_BUF ((card->buffers) + 4*(card->buffer_size)*2) + +#define RX_DMA_SIZE 2048 + +#define FPGA_VERSION(a,b) (((a) << 8) + (b)) +#define LEGACY_BUFFERS 2 +#define DMA_SUPPORTED 4 + +static int reset = 0; +static int atmdebug = 0; +static int firmware_upgrade = 0; +static int fpga_upgrade = 0; +static int db_firmware_upgrade = 0; +static int db_fpga_upgrade = 0; + +struct pkt_hdr { + __le16 size; + __le16 vpi; + __le16 vci; + __le16 type; +}; + +struct solos_skb_cb { + struct atm_vcc *vcc; + uint32_t dma_addr; +}; + + +#define SKB_CB(skb) ((struct solos_skb_cb *)skb->cb) + +#define PKT_DATA 0 +#define PKT_COMMAND 1 +#define PKT_POPEN 3 +#define PKT_PCLOSE 4 +#define PKT_STATUS 5 + +struct solos_card { + void __iomem *config_regs; + void __iomem *buffers; + int nr_ports; + int tx_mask; + struct pci_dev *dev; + struct atm_dev *atmdev[4]; + struct tasklet_struct tlet; + spinlock_t tx_lock; + spinlock_t tx_queue_lock; + spinlock_t cli_queue_lock; + spinlock_t param_queue_lock; + struct list_head param_queue; + struct sk_buff_head tx_queue[4]; + struct sk_buff_head cli_queue[4]; + struct sk_buff *tx_skb[4]; + struct sk_buff *rx_skb[4]; + unsigned char *dma_bounce; + wait_queue_head_t param_wq; + wait_queue_head_t fw_wq; + int using_dma; + int dma_alignment; + int fpga_version; + int buffer_size; + int atmel_flash; +}; + + +struct solos_param { + struct list_head list; + pid_t pid; + int port; + struct sk_buff *response; +}; + +#define SOLOS_CHAN(atmdev) ((int)(unsigned long)(atmdev)->phy_data) + +MODULE_AUTHOR("Traverse Technologies <support@traverse.com.au>"); +MODULE_DESCRIPTION("Solos PCI driver"); +MODULE_VERSION(VERSION); +MODULE_LICENSE("GPL"); +MODULE_FIRMWARE("solos-FPGA.bin"); +MODULE_FIRMWARE("solos-Firmware.bin"); +MODULE_FIRMWARE("solos-db-FPGA.bin"); +MODULE_PARM_DESC(reset, "Reset Solos chips on startup"); +MODULE_PARM_DESC(atmdebug, "Print ATM data"); +MODULE_PARM_DESC(firmware_upgrade, "Initiate Solos firmware upgrade"); +MODULE_PARM_DESC(fpga_upgrade, "Initiate FPGA upgrade"); +MODULE_PARM_DESC(db_firmware_upgrade, "Initiate daughter board Solos firmware upgrade"); +MODULE_PARM_DESC(db_fpga_upgrade, "Initiate daughter board FPGA upgrade"); +module_param(reset, int, 0444); +module_param(atmdebug, int, 0644); +module_param(firmware_upgrade, int, 0444); +module_param(fpga_upgrade, int, 0444); +module_param(db_firmware_upgrade, int, 0444); +module_param(db_fpga_upgrade, int, 0444); + +static void fpga_queue(struct solos_card *card, int port, struct sk_buff *skb, + struct atm_vcc *vcc); +static uint32_t fpga_tx(struct solos_card *); +static irqreturn_t solos_irq(int irq, void *dev_id); +static struct atm_vcc* find_vcc(struct atm_dev *dev, short vpi, int vci); +static int atm_init(struct solos_card *, struct device *); +static void atm_remove(struct solos_card *); +static int send_command(struct solos_card *card, int dev, const char *buf, size_t size); +static void solos_bh(unsigned long); +static int print_buffer(struct sk_buff *buf); + +static inline void solos_pop(struct atm_vcc *vcc, struct sk_buff *skb) +{ + if (vcc->pop) + vcc->pop(vcc, skb); + else + dev_kfree_skb_any(skb); +} + +static ssize_t solos_param_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev); + struct solos_card *card = atmdev->dev_data; + struct solos_param prm; + struct sk_buff *skb; + struct pkt_hdr *header; + int buflen; + + buflen = strlen(attr->attr.name) + 10; + + skb = alloc_skb(sizeof(*header) + buflen, GFP_KERNEL); + if (!skb) { + dev_warn(&card->dev->dev, "Failed to allocate sk_buff in solos_param_show()\n"); + return -ENOMEM; + } + + header = (void *)skb_put(skb, sizeof(*header)); + + buflen = snprintf((void *)&header[1], buflen - 1, + "L%05d\n%s\n", current->pid, attr->attr.name); + skb_put(skb, buflen); + + header->size = cpu_to_le16(buflen); + header->vpi = cpu_to_le16(0); + header->vci = cpu_to_le16(0); + header->type = cpu_to_le16(PKT_COMMAND); + + prm.pid = current->pid; + prm.response = NULL; + prm.port = SOLOS_CHAN(atmdev); + + spin_lock_irq(&card->param_queue_lock); + list_add(&prm.list, &card->param_queue); + spin_unlock_irq(&card->param_queue_lock); + + fpga_queue(card, prm.port, skb, NULL); + + wait_event_timeout(card->param_wq, prm.response, 5 * HZ); + + spin_lock_irq(&card->param_queue_lock); + list_del(&prm.list); + spin_unlock_irq(&card->param_queue_lock); + + if (!prm.response) + return -EIO; + + buflen = prm.response->len; + memcpy(buf, prm.response->data, buflen); + kfree_skb(prm.response); + + return buflen; +} + +static ssize_t solos_param_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev); + struct solos_card *card = atmdev->dev_data; + struct solos_param prm; + struct sk_buff *skb; + struct pkt_hdr *header; + int buflen; + ssize_t ret; + + buflen = strlen(attr->attr.name) + 11 + count; + + skb = alloc_skb(sizeof(*header) + buflen, GFP_KERNEL); + if (!skb) { + dev_warn(&card->dev->dev, "Failed to allocate sk_buff in solos_param_store()\n"); + return -ENOMEM; + } + + header = (void *)skb_put(skb, sizeof(*header)); + + buflen = snprintf((void *)&header[1], buflen - 1, + "L%05d\n%s\n%s\n", current->pid, attr->attr.name, buf); + + skb_put(skb, buflen); + header->size = cpu_to_le16(buflen); + header->vpi = cpu_to_le16(0); + header->vci = cpu_to_le16(0); + header->type = cpu_to_le16(PKT_COMMAND); + + prm.pid = current->pid; + prm.response = NULL; + prm.port = SOLOS_CHAN(atmdev); + + spin_lock_irq(&card->param_queue_lock); + list_add(&prm.list, &card->param_queue); + spin_unlock_irq(&card->param_queue_lock); + + fpga_queue(card, prm.port, skb, NULL); + + wait_event_timeout(card->param_wq, prm.response, 5 * HZ); + + spin_lock_irq(&card->param_queue_lock); + list_del(&prm.list); + spin_unlock_irq(&card->param_queue_lock); + + skb = prm.response; + + if (!skb) + return -EIO; + + buflen = skb->len; + + /* Sometimes it has a newline, sometimes it doesn't. */ + if (skb->data[buflen - 1] == '\n') + buflen--; + + if (buflen == 2 && !strncmp(skb->data, "OK", 2)) + ret = count; + else if (buflen == 5 && !strncmp(skb->data, "ERROR", 5)) + ret = -EIO; + else { + /* We know we have enough space allocated for this; we allocated + it ourselves */ + skb->data[buflen] = 0; + + dev_warn(&card->dev->dev, "Unexpected parameter response: '%s'\n", + skb->data); + ret = -EIO; + } + kfree_skb(skb); + + return ret; +} + +static char *next_string(struct sk_buff *skb) +{ + int i = 0; + char *this = skb->data; + + for (i = 0; i < skb->len; i++) { + if (this[i] == '\n') { + this[i] = 0; + skb_pull(skb, i + 1); + return this; + } + if (!isprint(this[i])) + return NULL; + } + return NULL; +} + +/* + * Status packet has fields separated by \n, starting with a version number + * for the information therein. Fields are.... + * + * packet version + * RxBitRate (version >= 1) + * TxBitRate (version >= 1) + * State (version >= 1) + * LocalSNRMargin (version >= 1) + * LocalLineAttn (version >= 1) + */ +static int process_status(struct solos_card *card, int port, struct sk_buff *skb) +{ + char *str, *end, *state_str, *snr, *attn; + int ver, rate_up, rate_down; + + if (!card->atmdev[port]) + return -ENODEV; + + str = next_string(skb); + if (!str) + return -EIO; + + ver = simple_strtol(str, NULL, 10); + if (ver < 1) { + dev_warn(&card->dev->dev, "Unexpected status interrupt version %d\n", + ver); + return -EIO; + } + + str = next_string(skb); + if (!str) + return -EIO; + if (!strcmp(str, "ERROR")) { + dev_dbg(&card->dev->dev, "Status packet indicated Solos error on port %d (starting up?)\n", + port); + return 0; + } + + rate_down = simple_strtol(str, &end, 10); + if (*end) + return -EIO; + + str = next_string(skb); + if (!str) + return -EIO; + rate_up = simple_strtol(str, &end, 10); + if (*end) + return -EIO; + + state_str = next_string(skb); + if (!state_str) + return -EIO; + + /* Anything but 'Showtime' is down */ + if (strcmp(state_str, "Showtime")) { + atm_dev_signal_change(card->atmdev[port], ATM_PHY_SIG_LOST); + dev_info(&card->dev->dev, "Port %d: %s\n", port, state_str); + return 0; + } + + snr = next_string(skb); + if (!snr) + return -EIO; + attn = next_string(skb); + if (!attn) + return -EIO; + + dev_info(&card->dev->dev, "Port %d: %s @%d/%d kb/s%s%s%s%s\n", + port, state_str, rate_down/1000, rate_up/1000, + snr[0]?", SNR ":"", snr, attn[0]?", Attn ":"", attn); + + card->atmdev[port]->link_rate = rate_down / 424; + atm_dev_signal_change(card->atmdev[port], ATM_PHY_SIG_FOUND); + + return 0; +} + +static int process_command(struct solos_card *card, int port, struct sk_buff *skb) +{ + struct solos_param *prm; + unsigned long flags; + int cmdpid; + int found = 0; + + if (skb->len < 7) + return 0; + + if (skb->data[0] != 'L' || !isdigit(skb->data[1]) || + !isdigit(skb->data[2]) || !isdigit(skb->data[3]) || + !isdigit(skb->data[4]) || !isdigit(skb->data[5]) || + skb->data[6] != '\n') + return 0; + + cmdpid = simple_strtol(&skb->data[1], NULL, 10); + + spin_lock_irqsave(&card->param_queue_lock, flags); + list_for_each_entry(prm, &card->param_queue, list) { + if (prm->port == port && prm->pid == cmdpid) { + prm->response = skb; + skb_pull(skb, 7); + wake_up(&card->param_wq); + found = 1; + break; + } + } + spin_unlock_irqrestore(&card->param_queue_lock, flags); + return found; +} + +static ssize_t console_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev); + struct solos_card *card = atmdev->dev_data; + struct sk_buff *skb; + unsigned int len; + + spin_lock(&card->cli_queue_lock); + skb = skb_dequeue(&card->cli_queue[SOLOS_CHAN(atmdev)]); + spin_unlock(&card->cli_queue_lock); + if(skb == NULL) + return sprintf(buf, "No data.\n"); + + len = skb->len; + memcpy(buf, skb->data, len); + + kfree_skb(skb); + return len; +} + +static int send_command(struct solos_card *card, int dev, const char *buf, size_t size) +{ + struct sk_buff *skb; + struct pkt_hdr *header; + + if (size > (BUF_SIZE - sizeof(*header))) { + dev_dbg(&card->dev->dev, "Command is too big. Dropping request\n"); + return 0; + } + skb = alloc_skb(size + sizeof(*header), GFP_ATOMIC); + if (!skb) { + dev_warn(&card->dev->dev, "Failed to allocate sk_buff in send_command()\n"); + return 0; + } + + header = (void *)skb_put(skb, sizeof(*header)); + + header->size = cpu_to_le16(size); + header->vpi = cpu_to_le16(0); + header->vci = cpu_to_le16(0); + header->type = cpu_to_le16(PKT_COMMAND); + + memcpy(skb_put(skb, size), buf, size); + + fpga_queue(card, dev, skb, NULL); + + return 0; +} + +static ssize_t console_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + struct atm_dev *atmdev = container_of(dev, struct atm_dev, class_dev); + struct solos_card *card = atmdev->dev_data; + int err; + + err = send_command(card, SOLOS_CHAN(atmdev), buf, count); + + return err?:count; +} + +struct geos_gpio_attr { + struct device_attribute attr; + int offset; +}; + +#define SOLOS_GPIO_ATTR(_name, _mode, _show, _store, _offset) \ + struct geos_gpio_attr gpio_attr_##_name = { \ + .attr = __ATTR(_name, _mode, _show, _store), \ + .offset = _offset } + +static ssize_t geos_gpio_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + struct pci_dev *pdev = container_of(dev, struct pci_dev, dev); + struct geos_gpio_attr *gattr = container_of(attr, struct geos_gpio_attr, attr); + struct solos_card *card = pci_get_drvdata(pdev); + uint32_t data32; + + if (count != 1 && (count != 2 || buf[1] != '\n')) + return -EINVAL; + + spin_lock_irq(&card->param_queue_lock); + data32 = ioread32(card->config_regs + GPIO_STATUS); + if (buf[0] == '1') { + data32 |= 1 << gattr->offset; + iowrite32(data32, card->config_regs + GPIO_STATUS); + } else if (buf[0] == '0') { + data32 &= ~(1 << gattr->offset); + iowrite32(data32, card->config_regs + GPIO_STATUS); + } else { + count = -EINVAL; + } + spin_unlock_irq(&card->param_queue_lock); + return count; +} + +static ssize_t geos_gpio_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct pci_dev *pdev = container_of(dev, struct pci_dev, dev); + struct geos_gpio_attr *gattr = container_of(attr, struct geos_gpio_attr, attr); + struct solos_card *card = pci_get_drvdata(pdev); + uint32_t data32; + + data32 = ioread32(card->config_regs + GPIO_STATUS); + data32 = (data32 >> gattr->offset) & 1; + + return sprintf(buf, "%d\n", data32); +} + +static ssize_t hardware_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct pci_dev *pdev = container_of(dev, struct pci_dev, dev); + struct geos_gpio_attr *gattr = container_of(attr, struct geos_gpio_attr, attr); + struct solos_card *card = pci_get_drvdata(pdev); + uint32_t data32; + + data32 = ioread32(card->config_regs + GPIO_STATUS); + switch (gattr->offset) { + case 0: + /* HardwareVersion */ + data32 = data32 & 0x1F; + break; + case 1: + /* HardwareVariant */ + data32 = (data32 >> 5) & 0x0F; + break; + } + return sprintf(buf, "%d\n", data32); +} + +static DEVICE_ATTR(console, 0644, console_show, console_store); + + +#define SOLOS_ATTR_RO(x) static DEVICE_ATTR(x, 0444, solos_param_show, NULL); +#define SOLOS_ATTR_RW(x) static DEVICE_ATTR(x, 0644, solos_param_show, solos_param_store); + +#include "solos-attrlist.c" + +static SOLOS_GPIO_ATTR(GPIO1, 0644, geos_gpio_show, geos_gpio_store, 9); +static SOLOS_GPIO_ATTR(GPIO2, 0644, geos_gpio_show, geos_gpio_store, 10); +static SOLOS_GPIO_ATTR(GPIO3, 0644, geos_gpio_show, geos_gpio_store, 11); +static SOLOS_GPIO_ATTR(GPIO4, 0644, geos_gpio_show, geos_gpio_store, 12); +static SOLOS_GPIO_ATTR(GPIO5, 0644, geos_gpio_show, geos_gpio_store, 13); +static SOLOS_GPIO_ATTR(PushButton, 0444, geos_gpio_show, NULL, 14); +static SOLOS_GPIO_ATTR(HardwareVersion, 0444, hardware_show, NULL, 0); +static SOLOS_GPIO_ATTR(HardwareVariant, 0444, hardware_show, NULL, 1); +#undef SOLOS_ATTR_RO +#undef SOLOS_ATTR_RW + +#define SOLOS_ATTR_RO(x) &dev_attr_##x.attr, +#define SOLOS_ATTR_RW(x) &dev_attr_##x.attr, + +static struct attribute *solos_attrs[] = { +#include "solos-attrlist.c" + NULL +}; + +static struct attribute_group solos_attr_group = { + .attrs = solos_attrs, + .name = "parameters", +}; + +static struct attribute *gpio_attrs[] = { + &gpio_attr_GPIO1.attr.attr, + &gpio_attr_GPIO2.attr.attr, + &gpio_attr_GPIO3.attr.attr, + &gpio_attr_GPIO4.attr.attr, + &gpio_attr_GPIO5.attr.attr, + &gpio_attr_PushButton.attr.attr, + &gpio_attr_HardwareVersion.attr.attr, + &gpio_attr_HardwareVariant.attr.attr, + NULL +}; + +static struct attribute_group gpio_attr_group = { + .attrs = gpio_attrs, + .name = "gpio", +}; + +static int flash_upgrade(struct solos_card *card, int chip) +{ + const struct firmware *fw; + const char *fw_name; + int blocksize = 0; + int numblocks = 0; + int offset; + + switch (chip) { + case 0: + fw_name = "solos-FPGA.bin"; + if (card->atmel_flash) + blocksize = ATMEL_FPGA_BLOCK; + else + blocksize = SPI_FLASH_BLOCK; + break; + case 1: + fw_name = "solos-Firmware.bin"; + if (card->atmel_flash) + blocksize = ATMEL_SOLOS_BLOCK; + else + blocksize = SPI_FLASH_BLOCK; + break; + case 2: + if (card->fpga_version > LEGACY_BUFFERS){ + fw_name = "solos-db-FPGA.bin"; + if (card->atmel_flash) + blocksize = ATMEL_FPGA_BLOCK; + else + blocksize = SPI_FLASH_BLOCK; + } else { + dev_info(&card->dev->dev, "FPGA version doesn't support" + " daughter board upgrades\n"); + return -EPERM; + } + break; + case 3: + if (card->fpga_version > LEGACY_BUFFERS){ + fw_name = "solos-Firmware.bin"; + if (card->atmel_flash) + blocksize = ATMEL_SOLOS_BLOCK; + else + blocksize = SPI_FLASH_BLOCK; + } else { + dev_info(&card->dev->dev, "FPGA version doesn't support" + " daughter board upgrades\n"); + return -EPERM; + } + break; + default: + return -ENODEV; + } + + if (request_firmware(&fw, fw_name, &card->dev->dev)) + return -ENOENT; + + dev_info(&card->dev->dev, "Flash upgrade starting\n"); + + /* New FPGAs require driver version before permitting flash upgrades */ + iowrite32(DRIVER_VERSION, card->config_regs + DRIVER_VER); + + numblocks = fw->size / blocksize; + dev_info(&card->dev->dev, "Firmware size: %zd\n", fw->size); + dev_info(&card->dev->dev, "Number of blocks: %d\n", numblocks); + + dev_info(&card->dev->dev, "Changing FPGA to Update mode\n"); + iowrite32(1, card->config_regs + FPGA_MODE); + (void) ioread32(card->config_regs + FPGA_MODE); + + /* Set mode to Chip Erase */ + if(chip == 0 || chip == 2) + dev_info(&card->dev->dev, "Set FPGA Flash mode to FPGA Chip Erase\n"); + if(chip == 1 || chip == 3) + dev_info(&card->dev->dev, "Set FPGA Flash mode to Solos Chip Erase\n"); + iowrite32((chip * 2), card->config_regs + FLASH_MODE); + + + iowrite32(1, card->config_regs + WRITE_FLASH); + wait_event(card->fw_wq, !ioread32(card->config_regs + FLASH_BUSY)); + + for (offset = 0; offset < fw->size; offset += blocksize) { + int i; + + /* Clear write flag */ + iowrite32(0, card->config_regs + WRITE_FLASH); + + /* Set mode to Block Write */ + /* dev_info(&card->dev->dev, "Set FPGA Flash mode to Block Write\n"); */ + iowrite32(((chip * 2) + 1), card->config_regs + FLASH_MODE); + + /* Copy block to buffer, swapping each 16 bits for Atmel flash */ + for(i = 0; i < blocksize; i += 4) { + uint32_t word; + if (card->atmel_flash) + word = swahb32p((uint32_t *)(fw->data + offset + i)); + else + word = *(uint32_t *)(fw->data + offset + i); + if(card->fpga_version > LEGACY_BUFFERS) + iowrite32(word, FLASH_BUF + i); + else + iowrite32(word, RX_BUF(card, 3) + i); + } + + /* Specify block number and then trigger flash write */ + iowrite32(offset / blocksize, card->config_regs + FLASH_BLOCK); + iowrite32(1, card->config_regs + WRITE_FLASH); + wait_event(card->fw_wq, !ioread32(card->config_regs + FLASH_BUSY)); + } + + release_firmware(fw); + iowrite32(0, card->config_regs + WRITE_FLASH); + iowrite32(0, card->config_regs + FPGA_MODE); + iowrite32(0, card->config_regs + FLASH_MODE); + dev_info(&card->dev->dev, "Returning FPGA to Data mode\n"); + return 0; +} + +static irqreturn_t solos_irq(int irq, void *dev_id) +{ + struct solos_card *card = dev_id; + int handled = 1; + + iowrite32(0, card->config_regs + IRQ_CLEAR); + + /* If we're up and running, just kick the tasklet to process TX/RX */ + if (card->atmdev[0]) + tasklet_schedule(&card->tlet); + else + wake_up(&card->fw_wq); + + return IRQ_RETVAL(handled); +} + +static void solos_bh(unsigned long card_arg) +{ + struct solos_card *card = (void *)card_arg; + uint32_t card_flags; + uint32_t rx_done = 0; + int port; + + /* + * Since fpga_tx() is going to need to read the flags under its lock, + * it can return them to us so that we don't have to hit PCI MMIO + * again for the same information + */ + card_flags = fpga_tx(card); + + for (port = 0; port < card->nr_ports; port++) { + if (card_flags & (0x10 << port)) { + struct pkt_hdr _hdr, *header; + struct sk_buff *skb; + struct atm_vcc *vcc; + int size; + + if (card->using_dma) { + skb = card->rx_skb[port]; + card->rx_skb[port] = NULL; + + pci_unmap_single(card->dev, SKB_CB(skb)->dma_addr, + RX_DMA_SIZE, PCI_DMA_FROMDEVICE); + + header = (void *)skb->data; + size = le16_to_cpu(header->size); + skb_put(skb, size + sizeof(*header)); + skb_pull(skb, sizeof(*header)); + } else { + header = &_hdr; + + rx_done |= 0x10 << port; + + memcpy_fromio(header, RX_BUF(card, port), sizeof(*header)); + + size = le16_to_cpu(header->size); + if (size > (card->buffer_size - sizeof(*header))){ + dev_warn(&card->dev->dev, "Invalid buffer size\n"); + continue; + } + + skb = alloc_skb(size + 1, GFP_ATOMIC); + if (!skb) { + if (net_ratelimit()) + dev_warn(&card->dev->dev, "Failed to allocate sk_buff for RX\n"); + continue; + } + + memcpy_fromio(skb_put(skb, size), + RX_BUF(card, port) + sizeof(*header), + size); + } + if (atmdebug) { + dev_info(&card->dev->dev, "Received: port %d\n", port); + dev_info(&card->dev->dev, "size: %d VPI: %d VCI: %d\n", + size, le16_to_cpu(header->vpi), + le16_to_cpu(header->vci)); + print_buffer(skb); + } + + switch (le16_to_cpu(header->type)) { + case PKT_DATA: + vcc = find_vcc(card->atmdev[port], le16_to_cpu(header->vpi), + le16_to_cpu(header->vci)); + if (!vcc) { + if (net_ratelimit()) + dev_warn(&card->dev->dev, "Received packet for unknown VPI.VCI %d.%d on port %d\n", + le16_to_cpu(header->vpi), le16_to_cpu(header->vci), + port); + dev_kfree_skb_any(skb); + break; + } + atm_charge(vcc, skb->truesize); + vcc->push(vcc, skb); + atomic_inc(&vcc->stats->rx); + break; + + case PKT_STATUS: + if (process_status(card, port, skb) && + net_ratelimit()) { + dev_warn(&card->dev->dev, "Bad status packet of %d bytes on port %d:\n", skb->len, port); + print_buffer(skb); + } + dev_kfree_skb_any(skb); + break; + + case PKT_COMMAND: + default: /* FIXME: Not really, surely? */ + if (process_command(card, port, skb)) + break; + spin_lock(&card->cli_queue_lock); + if (skb_queue_len(&card->cli_queue[port]) > 10) { + if (net_ratelimit()) + dev_warn(&card->dev->dev, "Dropping console response on port %d\n", + port); + dev_kfree_skb_any(skb); + } else + skb_queue_tail(&card->cli_queue[port], skb); + spin_unlock(&card->cli_queue_lock); + break; + } + } + /* Allocate RX skbs for any ports which need them */ + if (card->using_dma && card->atmdev[port] && + !card->rx_skb[port]) { + struct sk_buff *skb = alloc_skb(RX_DMA_SIZE, GFP_ATOMIC); + if (skb) { + SKB_CB(skb)->dma_addr = + pci_map_single(card->dev, skb->data, + RX_DMA_SIZE, PCI_DMA_FROMDEVICE); + iowrite32(SKB_CB(skb)->dma_addr, + card->config_regs + RX_DMA_ADDR(port)); + card->rx_skb[port] = skb; + } else { + if (net_ratelimit()) + dev_warn(&card->dev->dev, "Failed to allocate RX skb"); + + /* We'll have to try again later */ + tasklet_schedule(&card->tlet); + } + } + } + if (rx_done) + iowrite32(rx_done, card->config_regs + FLAGS_ADDR); + + return; +} + +static struct atm_vcc *find_vcc(struct atm_dev *dev, short vpi, int vci) +{ + struct hlist_head *head; + struct atm_vcc *vcc = NULL; + struct sock *s; + + read_lock(&vcc_sklist_lock); + head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)]; + sk_for_each(s, head) { + vcc = atm_sk(s); + if (vcc->dev == dev && vcc->vci == vci && + vcc->vpi == vpi && vcc->qos.rxtp.traffic_class != ATM_NONE && + test_bit(ATM_VF_READY, &vcc->flags)) + goto out; + } + vcc = NULL; + out: + read_unlock(&vcc_sklist_lock); + return vcc; +} + +static int popen(struct atm_vcc *vcc) +{ + struct solos_card *card = vcc->dev->dev_data; + struct sk_buff *skb; + struct pkt_hdr *header; + + if (vcc->qos.aal != ATM_AAL5) { + dev_warn(&card->dev->dev, "Unsupported ATM type %d\n", + vcc->qos.aal); + return -EINVAL; + } + + skb = alloc_skb(sizeof(*header), GFP_KERNEL); + if (!skb) { + if (net_ratelimit()) + dev_warn(&card->dev->dev, "Failed to allocate sk_buff in popen()\n"); + return -ENOMEM; + } + header = (void *)skb_put(skb, sizeof(*header)); + + header->size = cpu_to_le16(0); + header->vpi = cpu_to_le16(vcc->vpi); + header->vci = cpu_to_le16(vcc->vci); + header->type = cpu_to_le16(PKT_POPEN); + + fpga_queue(card, SOLOS_CHAN(vcc->dev), skb, NULL); + + set_bit(ATM_VF_ADDR, &vcc->flags); + set_bit(ATM_VF_READY, &vcc->flags); + + return 0; +} + +static void pclose(struct atm_vcc *vcc) +{ + struct solos_card *card = vcc->dev->dev_data; + unsigned char port = SOLOS_CHAN(vcc->dev); + struct sk_buff *skb, *tmpskb; + struct pkt_hdr *header; + + /* Remove any yet-to-be-transmitted packets from the pending queue */ + spin_lock(&card->tx_queue_lock); + skb_queue_walk_safe(&card->tx_queue[port], skb, tmpskb) { + if (SKB_CB(skb)->vcc == vcc) { + skb_unlink(skb, &card->tx_queue[port]); + solos_pop(vcc, skb); + } + } + spin_unlock(&card->tx_queue_lock); + + skb = alloc_skb(sizeof(*header), GFP_KERNEL); + if (!skb) { + dev_warn(&card->dev->dev, "Failed to allocate sk_buff in pclose()\n"); + return; + } + header = (void *)skb_put(skb, sizeof(*header)); + + header->size = cpu_to_le16(0); + header->vpi = cpu_to_le16(vcc->vpi); + header->vci = cpu_to_le16(vcc->vci); + header->type = cpu_to_le16(PKT_PCLOSE); + + skb_get(skb); + fpga_queue(card, port, skb, NULL); + + if (!wait_event_timeout(card->param_wq, !skb_shared(skb), 5 * HZ)) + dev_warn(&card->dev->dev, + "Timeout waiting for VCC close on port %d\n", port); + + dev_kfree_skb(skb); + + /* Hold up vcc_destroy_socket() (our caller) until solos_bh() in the + tasklet has finished processing any incoming packets (and, more to + the point, using the vcc pointer). */ + tasklet_unlock_wait(&card->tlet); + + clear_bit(ATM_VF_ADDR, &vcc->flags); + + return; +} + +static int print_buffer(struct sk_buff *buf) +{ + int len,i; + char msg[500]; + char item[10]; + + len = buf->len; + for (i = 0; i < len; i++){ + if(i % 8 == 0) + sprintf(msg, "%02X: ", i); + + sprintf(item,"%02X ",*(buf->data + i)); + strcat(msg, item); + if(i % 8 == 7) { + sprintf(item, "\n"); + strcat(msg, item); + printk(KERN_DEBUG "%s", msg); + } + } + if (i % 8 != 0) { + sprintf(item, "\n"); + strcat(msg, item); + printk(KERN_DEBUG "%s", msg); + } + printk(KERN_DEBUG "\n"); + + return 0; +} + +static void fpga_queue(struct solos_card *card, int port, struct sk_buff *skb, + struct atm_vcc *vcc) +{ + int old_len; + unsigned long flags; + + SKB_CB(skb)->vcc = vcc; + + spin_lock_irqsave(&card->tx_queue_lock, flags); + old_len = skb_queue_len(&card->tx_queue[port]); + skb_queue_tail(&card->tx_queue[port], skb); + if (!old_len) + card->tx_mask |= (1 << port); + spin_unlock_irqrestore(&card->tx_queue_lock, flags); + + /* Theoretically we could just schedule the tasklet here, but + that introduces latency we don't want -- it's noticeable */ + if (!old_len) + fpga_tx(card); +} + +static uint32_t fpga_tx(struct solos_card *card) +{ + uint32_t tx_pending, card_flags; + uint32_t tx_started = 0; + struct sk_buff *skb; + struct atm_vcc *vcc; + unsigned char port; + unsigned long flags; + + spin_lock_irqsave(&card->tx_lock, flags); + + card_flags = ioread32(card->config_regs + FLAGS_ADDR); + /* + * The queue lock is required for _writing_ to tx_mask, but we're + * OK to read it here without locking. The only potential update + * that we could race with is in fpga_queue() where it sets a bit + * for a new port... but it's going to call this function again if + * it's doing that, anyway. + */ + tx_pending = card->tx_mask & ~card_flags; + + for (port = 0; tx_pending; tx_pending >>= 1, port++) { + if (tx_pending & 1) { + struct sk_buff *oldskb = card->tx_skb[port]; + if (oldskb) { + pci_unmap_single(card->dev, SKB_CB(oldskb)->dma_addr, + oldskb->len, PCI_DMA_TODEVICE); + card->tx_skb[port] = NULL; + } + spin_lock(&card->tx_queue_lock); + skb = skb_dequeue(&card->tx_queue[port]); + if (!skb) + card->tx_mask &= ~(1 << port); + spin_unlock(&card->tx_queue_lock); + + if (skb && !card->using_dma) { + memcpy_toio(TX_BUF(card, port), skb->data, skb->len); + tx_started |= 1 << port; + oldskb = skb; /* We're done with this skb already */ + } else if (skb && card->using_dma) { + unsigned char *data = skb->data; + if ((unsigned long)data & card->dma_alignment) { + data = card->dma_bounce + (BUF_SIZE * port); + memcpy(data, skb->data, skb->len); + } + SKB_CB(skb)->dma_addr = pci_map_single(card->dev, data, + skb->len, PCI_DMA_TODEVICE); + card->tx_skb[port] = skb; + iowrite32(SKB_CB(skb)->dma_addr, + card->config_regs + TX_DMA_ADDR(port)); + } + + if (!oldskb) + continue; + + /* Clean up and free oldskb now it's gone */ + if (atmdebug) { + struct pkt_hdr *header = (void *)oldskb->data; + int size = le16_to_cpu(header->size); + + skb_pull(oldskb, sizeof(*header)); + dev_info(&card->dev->dev, "Transmitted: port %d\n", + port); + dev_info(&card->dev->dev, "size: %d VPI: %d VCI: %d\n", + size, le16_to_cpu(header->vpi), + le16_to_cpu(header->vci)); + print_buffer(oldskb); + } + + vcc = SKB_CB(oldskb)->vcc; + + if (vcc) { + atomic_inc(&vcc->stats->tx); + solos_pop(vcc, oldskb); + } else { + dev_kfree_skb_irq(oldskb); + wake_up(&card->param_wq); + } + } + } + /* For non-DMA TX, write the 'TX start' bit for all four ports simultaneously */ + if (tx_started) + iowrite32(tx_started, card->config_regs + FLAGS_ADDR); + + spin_unlock_irqrestore(&card->tx_lock, flags); + return card_flags; +} + +static int psend(struct atm_vcc *vcc, struct sk_buff *skb) +{ + struct solos_card *card = vcc->dev->dev_data; + struct pkt_hdr *header; + int pktlen; + + pktlen = skb->len; + if (pktlen > (BUF_SIZE - sizeof(*header))) { + dev_warn(&card->dev->dev, "Length of PDU is too large. Dropping PDU.\n"); + solos_pop(vcc, skb); + return 0; + } + + if (!skb_clone_writable(skb, sizeof(*header))) { + int expand_by = 0; + int ret; + + if (skb_headroom(skb) < sizeof(*header)) + expand_by = sizeof(*header) - skb_headroom(skb); + + ret = pskb_expand_head(skb, expand_by, 0, GFP_ATOMIC); + if (ret) { + dev_warn(&card->dev->dev, "pskb_expand_head failed.\n"); + solos_pop(vcc, skb); + return ret; + } + } + + header = (void *)skb_push(skb, sizeof(*header)); + + /* This does _not_ include the size of the header */ + header->size = cpu_to_le16(pktlen); + header->vpi = cpu_to_le16(vcc->vpi); + header->vci = cpu_to_le16(vcc->vci); + header->type = cpu_to_le16(PKT_DATA); + + fpga_queue(card, SOLOS_CHAN(vcc->dev), skb, vcc); + + return 0; +} + +static struct atmdev_ops fpga_ops = { + .open = popen, + .close = pclose, + .ioctl = NULL, + .getsockopt = NULL, + .setsockopt = NULL, + .send = psend, + .send_oam = NULL, + .phy_put = NULL, + .phy_get = NULL, + .change_qos = NULL, + .proc_read = NULL, + .owner = THIS_MODULE +}; + +static int fpga_probe(struct pci_dev *dev, const struct pci_device_id *id) +{ + int err; + uint16_t fpga_ver; + uint8_t major_ver, minor_ver; + uint32_t data32; + struct solos_card *card; + + card = kzalloc(sizeof(*card), GFP_KERNEL); + if (!card) + return -ENOMEM; + + card->dev = dev; + init_waitqueue_head(&card->fw_wq); + init_waitqueue_head(&card->param_wq); + + err = pci_enable_device(dev); + if (err) { + dev_warn(&dev->dev, "Failed to enable PCI device\n"); + goto out; + } + + err = pci_set_dma_mask(dev, DMA_BIT_MASK(32)); + if (err) { + dev_warn(&dev->dev, "Failed to set 32-bit DMA mask\n"); + goto out; + } + + err = pci_request_regions(dev, "solos"); + if (err) { + dev_warn(&dev->dev, "Failed to request regions\n"); + goto out; + } + + card->config_regs = pci_iomap(dev, 0, CONFIG_RAM_SIZE); + if (!card->config_regs) { + dev_warn(&dev->dev, "Failed to ioremap config registers\n"); + goto out_release_regions; + } + card->buffers = pci_iomap(dev, 1, DATA_RAM_SIZE); + if (!card->buffers) { + dev_warn(&dev->dev, "Failed to ioremap data buffers\n"); + goto out_unmap_config; + } + + if (reset) { + iowrite32(1, card->config_regs + FPGA_MODE); + data32 = ioread32(card->config_regs + FPGA_MODE); + + iowrite32(0, card->config_regs + FPGA_MODE); + data32 = ioread32(card->config_regs + FPGA_MODE); + } + + data32 = ioread32(card->config_regs + FPGA_VER); + fpga_ver = (data32 & 0x0000FFFF); + major_ver = ((data32 & 0xFF000000) >> 24); + minor_ver = ((data32 & 0x00FF0000) >> 16); + card->fpga_version = FPGA_VERSION(major_ver,minor_ver); + if (card->fpga_version > LEGACY_BUFFERS) + card->buffer_size = BUF_SIZE; + else + card->buffer_size = OLD_BUF_SIZE; + dev_info(&dev->dev, "Solos FPGA Version %d.%02d svn-%d\n", + major_ver, minor_ver, fpga_ver); + + if (fpga_ver < 37 && (fpga_upgrade || firmware_upgrade || + db_fpga_upgrade || db_firmware_upgrade)) { + dev_warn(&dev->dev, + "FPGA too old; cannot upgrade flash. Use JTAG.\n"); + fpga_upgrade = firmware_upgrade = 0; + db_fpga_upgrade = db_firmware_upgrade = 0; + } + + /* Stopped using Atmel flash after 0.03-38 */ + if (fpga_ver < 39) + card->atmel_flash = 1; + else + card->atmel_flash = 0; + + data32 = ioread32(card->config_regs + PORTS); + card->nr_ports = (data32 & 0x000000FF); + + if (card->fpga_version >= DMA_SUPPORTED) { + pci_set_master(dev); + card->using_dma = 1; + if (1) { /* All known FPGA versions so far */ + card->dma_alignment = 3; + card->dma_bounce = kmalloc(card->nr_ports * BUF_SIZE, GFP_KERNEL); + if (!card->dma_bounce) { + dev_warn(&card->dev->dev, "Failed to allocate DMA bounce buffers\n"); + /* Fallback to MMIO doesn't work */ + goto out_unmap_both; + } + } + } else { + card->using_dma = 0; + /* Set RX empty flag for all ports */ + iowrite32(0xF0, card->config_regs + FLAGS_ADDR); + } + + pci_set_drvdata(dev, card); + + tasklet_init(&card->tlet, solos_bh, (unsigned long)card); + spin_lock_init(&card->tx_lock); + spin_lock_init(&card->tx_queue_lock); + spin_lock_init(&card->cli_queue_lock); + spin_lock_init(&card->param_queue_lock); + INIT_LIST_HEAD(&card->param_queue); + + err = request_irq(dev->irq, solos_irq, IRQF_SHARED, + "solos-pci", card); + if (err) { + dev_dbg(&card->dev->dev, "Failed to request interrupt IRQ: %d\n", dev->irq); + goto out_unmap_both; + } + + iowrite32(1, card->config_regs + IRQ_EN_ADDR); + + if (fpga_upgrade) + flash_upgrade(card, 0); + + if (firmware_upgrade) + flash_upgrade(card, 1); + + if (db_fpga_upgrade) + flash_upgrade(card, 2); + + if (db_firmware_upgrade) + flash_upgrade(card, 3); + + err = atm_init(card, &dev->dev); + if (err) + goto out_free_irq; + + if (card->fpga_version >= DMA_SUPPORTED && + sysfs_create_group(&card->dev->dev.kobj, &gpio_attr_group)) + dev_err(&card->dev->dev, "Could not register parameter group for GPIOs\n"); + + return 0; + + out_free_irq: + iowrite32(0, card->config_regs + IRQ_EN_ADDR); + free_irq(dev->irq, card); + tasklet_kill(&card->tlet); + + out_unmap_both: + kfree(card->dma_bounce); + pci_iounmap(dev, card->buffers); + out_unmap_config: + pci_iounmap(dev, card->config_regs); + out_release_regions: + pci_release_regions(dev); + out: + kfree(card); + return err; +} + +static int atm_init(struct solos_card *card, struct device *parent) +{ + int i; + + for (i = 0; i < card->nr_ports; i++) { + struct sk_buff *skb; + struct pkt_hdr *header; + + skb_queue_head_init(&card->tx_queue[i]); + skb_queue_head_init(&card->cli_queue[i]); + + card->atmdev[i] = atm_dev_register("solos-pci", parent, &fpga_ops, -1, NULL); + if (!card->atmdev[i]) { + dev_err(&card->dev->dev, "Could not register ATM device %d\n", i); + atm_remove(card); + return -ENODEV; + } + if (device_create_file(&card->atmdev[i]->class_dev, &dev_attr_console)) + dev_err(&card->dev->dev, "Could not register console for ATM device %d\n", i); + if (sysfs_create_group(&card->atmdev[i]->class_dev.kobj, &solos_attr_group)) + dev_err(&card->dev->dev, "Could not register parameter group for ATM device %d\n", i); + + dev_info(&card->dev->dev, "Registered ATM device %d\n", card->atmdev[i]->number); + + card->atmdev[i]->ci_range.vpi_bits = 8; + card->atmdev[i]->ci_range.vci_bits = 16; + card->atmdev[i]->dev_data = card; + card->atmdev[i]->phy_data = (void *)(unsigned long)i; + atm_dev_signal_change(card->atmdev[i], ATM_PHY_SIG_FOUND); + + skb = alloc_skb(sizeof(*header), GFP_KERNEL); + if (!skb) { + dev_warn(&card->dev->dev, "Failed to allocate sk_buff in atm_init()\n"); + continue; + } + + header = (void *)skb_put(skb, sizeof(*header)); + + header->size = cpu_to_le16(0); + header->vpi = cpu_to_le16(0); + header->vci = cpu_to_le16(0); + header->type = cpu_to_le16(PKT_STATUS); + + fpga_queue(card, i, skb, NULL); + } + return 0; +} + +static void atm_remove(struct solos_card *card) +{ + int i; + + for (i = 0; i < card->nr_ports; i++) { + if (card->atmdev[i]) { + struct sk_buff *skb; + + dev_info(&card->dev->dev, "Unregistering ATM device %d\n", card->atmdev[i]->number); + + sysfs_remove_group(&card->atmdev[i]->class_dev.kobj, &solos_attr_group); + atm_dev_deregister(card->atmdev[i]); + + skb = card->rx_skb[i]; + if (skb) { + pci_unmap_single(card->dev, SKB_CB(skb)->dma_addr, + RX_DMA_SIZE, PCI_DMA_FROMDEVICE); + dev_kfree_skb(skb); + } + skb = card->tx_skb[i]; + if (skb) { + pci_unmap_single(card->dev, SKB_CB(skb)->dma_addr, + skb->len, PCI_DMA_TODEVICE); + dev_kfree_skb(skb); + } + while ((skb = skb_dequeue(&card->tx_queue[i]))) + dev_kfree_skb(skb); + + } + } +} + +static void fpga_remove(struct pci_dev *dev) +{ + struct solos_card *card = pci_get_drvdata(dev); + + /* Disable IRQs */ + iowrite32(0, card->config_regs + IRQ_EN_ADDR); + + /* Reset FPGA */ + iowrite32(1, card->config_regs + FPGA_MODE); + (void)ioread32(card->config_regs + FPGA_MODE); + + if (card->fpga_version >= DMA_SUPPORTED) + sysfs_remove_group(&card->dev->dev.kobj, &gpio_attr_group); + + atm_remove(card); + + free_irq(dev->irq, card); + tasklet_kill(&card->tlet); + + kfree(card->dma_bounce); + + /* Release device from reset */ + iowrite32(0, card->config_regs + FPGA_MODE); + (void)ioread32(card->config_regs + FPGA_MODE); + + pci_iounmap(dev, card->buffers); + pci_iounmap(dev, card->config_regs); + + pci_release_regions(dev); + pci_disable_device(dev); + + kfree(card); +} + +static struct pci_device_id fpga_pci_tbl[] = { + { 0x10ee, 0x0300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { 0, } +}; + +MODULE_DEVICE_TABLE(pci,fpga_pci_tbl); + +static struct pci_driver fpga_driver = { + .name = "solos", + .id_table = fpga_pci_tbl, + .probe = fpga_probe, + .remove = fpga_remove, +}; + + +static int __init solos_pci_init(void) +{ + BUILD_BUG_ON(sizeof(struct solos_skb_cb) > sizeof(((struct sk_buff *)0)->cb)); + + printk(KERN_INFO "Solos PCI Driver Version %s\n", VERSION); + return pci_register_driver(&fpga_driver); +} + +static void __exit solos_pci_exit(void) +{ + pci_unregister_driver(&fpga_driver); + printk(KERN_INFO "Solos PCI Driver %s Unloaded\n", VERSION); +} + +module_init(solos_pci_init); +module_exit(solos_pci_exit); diff --git a/drivers/atm/suni.c b/drivers/atm/suni.c index b1d063cc4fb..02159345566 100644 --- a/drivers/atm/suni.c +++ b/drivers/atm/suni.c @@ -1,8 +1,14 @@ -/* drivers/atm/suni.c - PMC PM5346 SUNI (PHY) driver */ +/* + * drivers/atm/suni.c - S/UNI PHY driver + * + * Supports the following: + * PMC PM5346 S/UNI LITE + * PMC PM5350 S/UNI 155 ULTRA + * PMC PM5355 S/UNI 622 + */ /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ - #include <linux/module.h> #include <linux/jiffies.h> #include <linux/kernel.h> @@ -15,10 +21,10 @@ #include <linux/init.h> #include <linux/capability.h> #include <linux/atm_suni.h> -#include <asm/system.h> +#include <linux/slab.h> #include <asm/param.h> #include <asm/uaccess.h> -#include <asm/atomic.h> +#include <linux/atomic.h> #include "suni.h" @@ -29,15 +35,6 @@ #define DPRINTK(format,args...) #endif - -struct suni_priv { - struct k_sonet_stats sonet_stats; /* link diagnostics */ - int loop_mode; /* loopback mode */ - struct atm_dev *dev; /* device back-pointer */ - struct suni_priv *next; /* next SUNI */ -}; - - #define PRIV(dev) ((struct suni_priv *) dev->phy_data) #define PUT(val,reg) dev->ops->phy_put(dev,val,SUNI_##reg) @@ -155,25 +152,105 @@ static int get_diag(struct atm_dev *dev,void __user *arg) static int set_loopback(struct atm_dev *dev,int mode) { unsigned char control; + int reg, dle, lle; + + if (PRIV(dev)->type == SUNI_MRI_TYPE_PM5355) { + reg = SUNI_MCM; + dle = SUNI_MCM_DLE; + lle = SUNI_MCM_LLE; + } else { + reg = SUNI_MCT; + dle = SUNI_MCT_DLE; + lle = SUNI_MCT_LLE; + } - control = GET(MCT) & ~(SUNI_MCT_DLE | SUNI_MCT_LLE); + control = dev->ops->phy_get(dev, reg) & ~(dle | lle); switch (mode) { case ATM_LM_NONE: break; case ATM_LM_LOC_PHY: - control |= SUNI_MCT_DLE; + control |= dle; break; case ATM_LM_RMT_PHY: - control |= SUNI_MCT_LLE; + control |= lle; break; default: return -EINVAL; } - PUT(control,MCT); + dev->ops->phy_put(dev, control, reg); PRIV(dev)->loop_mode = mode; return 0; } +/* + * SONET vs. SDH Configuration + * + * Z0INS (register 0x06): 0 for SONET, 1 for SDH + * ENSS (register 0x3D): 0 for SONET, 1 for SDH + * LEN16 (register 0x28): 0 for SONET, 1 for SDH (n/a for S/UNI 155 QUAD) + * LEN16 (register 0x50): 0 for SONET, 1 for SDH (n/a for S/UNI 155 QUAD) + * S[1:0] (register 0x46): 00 for SONET, 10 for SDH + */ + +static int set_sonet(struct atm_dev *dev) +{ + if (PRIV(dev)->type == SUNI_MRI_TYPE_PM5355) { + PUT(GET(RPOP_RC) & ~SUNI_RPOP_RC_ENSS, RPOP_RC); + PUT(GET(SSTB_CTRL) & ~SUNI_SSTB_CTRL_LEN16, SSTB_CTRL); + PUT(GET(SPTB_CTRL) & ~SUNI_SPTB_CTRL_LEN16, SPTB_CTRL); + } + + REG_CHANGE(SUNI_TPOP_APM_S, SUNI_TPOP_APM_S_SHIFT, + SUNI_TPOP_S_SONET, TPOP_APM); + + return 0; +} + +static int set_sdh(struct atm_dev *dev) +{ + if (PRIV(dev)->type == SUNI_MRI_TYPE_PM5355) { + PUT(GET(RPOP_RC) | SUNI_RPOP_RC_ENSS, RPOP_RC); + PUT(GET(SSTB_CTRL) | SUNI_SSTB_CTRL_LEN16, SSTB_CTRL); + PUT(GET(SPTB_CTRL) | SUNI_SPTB_CTRL_LEN16, SPTB_CTRL); + } + + REG_CHANGE(SUNI_TPOP_APM_S, SUNI_TPOP_APM_S_SHIFT, + SUNI_TPOP_S_SDH, TPOP_APM); + + return 0; +} + + +static int get_framing(struct atm_dev *dev, void __user *arg) +{ + int framing; + unsigned char s; + + + s = (GET(TPOP_APM) & SUNI_TPOP_APM_S) >> SUNI_TPOP_APM_S_SHIFT; + if (s == SUNI_TPOP_S_SONET) + framing = SONET_FRAME_SONET; + else + framing = SONET_FRAME_SDH; + + return put_user(framing, (int __user *) arg) ? -EFAULT : 0; +} + +static int set_framing(struct atm_dev *dev, void __user *arg) +{ + int mode; + + if (get_user(mode, (int __user *) arg)) + return -EFAULT; + + if (mode == SONET_FRAME_SONET) + return set_sonet(dev); + else if (mode == SONET_FRAME_SDH) + return set_sdh(dev); + + return -EINVAL; +} + static int suni_ioctl(struct atm_dev *dev,unsigned int cmd,void __user *arg) { @@ -188,14 +265,16 @@ static int suni_ioctl(struct atm_dev *dev,unsigned int cmd,void __user *arg) case SONET_GETDIAG: return get_diag(dev,arg); case SONET_SETFRAMING: - if ((int)(unsigned long)arg != SONET_FRAME_SONET) return -EINVAL; - return 0; + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + return set_framing(dev, arg); case SONET_GETFRAMING: - return put_user(SONET_FRAME_SONET,(int __user *)arg) ? - -EFAULT : 0; + return get_framing(dev, arg); case SONET_GETFRSENSE: return -EINVAL; case ATM_SETLOOP: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; return set_loopback(dev,(int)(unsigned long)arg); case ATM_GETLOOP: return put_user(PRIV(dev)->loop_mode,(int __user *)arg) ? @@ -211,8 +290,9 @@ static int suni_ioctl(struct atm_dev *dev,unsigned int cmd,void __user *arg) static void poll_los(struct atm_dev *dev) { - dev->signal = GET(RSOP_SIS) & SUNI_RSOP_SIS_LOSV ? ATM_PHY_SIG_LOST : - ATM_PHY_SIG_FOUND; + atm_dev_signal_change(dev, + GET(RSOP_SIS) & SUNI_RSOP_SIS_LOSV ? + ATM_PHY_SIG_LOST : ATM_PHY_SIG_FOUND); } @@ -229,10 +309,6 @@ static int suni_start(struct atm_dev *dev) unsigned long flags; int first; - if (!(dev->phy_data = kmalloc(sizeof(struct suni_priv),GFP_KERNEL))) - return -ENOMEM; - - PRIV(dev)->dev = dev; spin_lock_irqsave(&sunis_lock,flags); first = !sunis; PRIV(dev)->next = sunis; @@ -293,16 +369,21 @@ int suni_init(struct atm_dev *dev) { unsigned char mri; + if (!(dev->phy_data = kmalloc(sizeof(struct suni_priv),GFP_KERNEL))) + return -ENOMEM; + PRIV(dev)->dev = dev; + mri = GET(MRI); /* reset SUNI */ + PRIV(dev)->type = (mri & SUNI_MRI_TYPE) >> SUNI_MRI_TYPE_SHIFT; PUT(mri | SUNI_MRI_RESET,MRI); PUT(mri,MRI); PUT((GET(MT) & SUNI_MT_DS27_53),MT); /* disable all tests */ - REG_CHANGE(SUNI_TPOP_APM_S,SUNI_TPOP_APM_S_SHIFT,SUNI_TPOP_S_SONET, - TPOP_APM); /* use SONET */ + set_sonet(dev); REG_CHANGE(SUNI_TACP_IUCHP_CLP,0,SUNI_TACP_IUCHP_CLP, TACP_IUCHP); /* idle cells */ PUT(SUNI_IDLE_PATTERN,TACP_IUCPOP); dev->phy = &suni_ops; + return 0; } diff --git a/drivers/atm/suni.h b/drivers/atm/suni.h index d14c835abc9..7e3e656b399 100644 --- a/drivers/atm/suni.h +++ b/drivers/atm/suni.h @@ -1,14 +1,15 @@ -/* drivers/atm/suni.h - PMC PM5346 SUNI (PHY) declarations */ +/* + * drivers/atm/suni.h - S/UNI PHY driver + */ /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ - #ifndef DRIVER_ATM_SUNI_H #define DRIVER_ATM_SUNI_H #include <linux/atmdev.h> #include <linux/atmioc.h> - +#include <linux/sonet.h> /* SUNI registers */ @@ -39,7 +40,8 @@ #define SUNI_RLOP_LFM 0x1F /* RLOP Line FEBE MSB */ #define SUNI_TLOP_CTRL 0x20 /* TLOP Control */ #define SUNI_TLOP_DIAG 0x21 /* TLOP Diagnostic */ - /* 0x22-0x2F reserved */ + /* 0x22-0x27 reserved */ +#define SUNI_SSTB_CTRL 0x28 #define SUNI_RPOP_SC 0x30 /* RPOP Status/Control */ #define SUNI_RPOP_IS 0x31 /* RPOP Interrupt Status */ /* 0x32 reserved */ @@ -52,6 +54,7 @@ #define SUNI_RPOP_PFM 0x3B /* RPOP Path FEBE MSB */ /* 0x3C reserved */ #define SUNI_RPOP_PBC 0x3D /* RPOP Path BIP-8 Configuration */ +#define SUNI_RPOP_RC 0x3D /* RPOP Ring Control (PM5355) */ /* 0x3E-0x3F reserved */ #define SUNI_TPOP_CD 0x40 /* TPOP Control/Diagnostic */ #define SUNI_TPOP_PC 0x41 /* TPOP Pointer Control */ @@ -82,7 +85,8 @@ #define SUNI_TACP_TCC 0x65 /* TACP Transmit Cell Counter */ #define SUNI_TACP_TCCM 0x66 /* TACP Transmit Cell Counter MSB */ #define SUNI_TACP_CFG 0x67 /* TACP Configuration */ - /* 0x68-0x7F reserved */ +#define SUNI_SPTB_CTRL 0x68 /* SPTB Control */ + /* 0x69-0x7F reserved */ #define SUNI_MT 0x80 /* Master Test */ /* 0x81-0xFF reserved */ @@ -94,9 +98,18 @@ #define SUNI_MRI_ID_SHIFT 0 #define SUNI_MRI_TYPE 0x70 /* R, SUNI type (lite is 011) */ #define SUNI_MRI_TYPE_SHIFT 4 +#define SUNI_MRI_TYPE_PM5346 0x3 /* S/UNI 155 LITE */ +#define SUNI_MRI_TYPE_PM5347 0x4 /* S/UNI 155 PLUS */ +#define SUNI_MRI_TYPE_PM5350 0x7 /* S/UNI 155 ULTRA */ +#define SUNI_MRI_TYPE_PM5355 0x1 /* S/UNI 622 */ #define SUNI_MRI_RESET 0x80 /* RW, reset & power down chip 0: normal operation 1: reset & low power */ + +/* MCM is reg 0x4 */ +#define SUNI_MCM_LLE 0x20 /* line loopback (PM5355) */ +#define SUNI_MCM_DLE 0x10 /* diagnostic loopback (PM5355) */ + /* MCT is reg 5 */ #define SUNI_MCT_LOOPT 0x01 /* RW, timing source, 0: from TRCLK+/- */ @@ -144,6 +157,12 @@ /* TLOP_DIAG is reg 0x21 */ #define SUNI_TLOP_DIAG_DBIP 0x01 /* insert line BIP err (continuously) */ +/* SSTB_CTRL is reg 0x28 */ +#define SUNI_SSTB_CTRL_LEN16 0x01 /* path trace message length bit */ + +/* RPOP_RC is reg 0x3D (PM5355) */ +#define SUNI_RPOP_RC_ENSS 0x40 /* enable size bit */ + /* TPOP_DIAG is reg 0x40 */ #define SUNI_TPOP_DIAG_PAIS 0x01 /* insert STS path alarm ind (cont) */ #define SUNI_TPOP_DIAG_DB3 0x02 /* insert path BIP err (continuously) */ @@ -191,6 +210,9 @@ pattern */ #define SUNI_TACP_IUCHP_GFC_SHIFT 4 +/* SPTB_CTRL is reg 0x68 */ +#define SUNI_SPTB_CTRL_LEN16 0x01 /* path trace message length */ + /* MT is reg 0x80 */ #define SUNI_MT_HIZIO 0x01 /* RW, all but data bus & MP interface tri-state */ @@ -205,6 +227,14 @@ #ifdef __KERNEL__ +struct suni_priv { + struct k_sonet_stats sonet_stats; /* link diagnostics */ + int loop_mode; /* loopback mode */ + int type; /* phy type */ + struct atm_dev *dev; /* device back-pointer */ + struct suni_priv *next; /* next SUNI */ +}; + int suni_init(struct atm_dev *dev); #endif diff --git a/drivers/atm/uPD98402.c b/drivers/atm/uPD98402.c index fc8cb07c247..5120a96b3a8 100644 --- a/drivers/atm/uPD98402.c +++ b/drivers/atm/uPD98402.c @@ -9,8 +9,9 @@ #include <linux/atmdev.h> #include <linux/sonet.h> #include <linux/init.h> +#include <linux/slab.h> #include <asm/uaccess.h> -#include <asm/atomic.h> +#include <linux/atomic.h> #include "uPD98402.h" diff --git a/drivers/atm/zatm.c b/drivers/atm/zatm.c index 58583c6ac5b..969c3c29000 100644 --- a/drivers/atm/zatm.c +++ b/drivers/atm/zatm.c @@ -16,16 +16,17 @@ #include <linux/delay.h> #include <linux/uio.h> #include <linux/init.h> +#include <linux/interrupt.h> #include <linux/dma-mapping.h> #include <linux/atm_zatm.h> #include <linux/capability.h> #include <linux/bitops.h> #include <linux/wait.h> +#include <linux/slab.h> #include <asm/byteorder.h> -#include <asm/system.h> #include <asm/string.h> #include <asm/io.h> -#include <asm/atomic.h> +#include <linux/atomic.h> #include <asm/uaccess.h> #include "uPD98401.h" @@ -496,8 +497,8 @@ static int open_rx_first(struct atm_vcc *vcc) vcc->qos.rxtp.max_sdu = 65464; /* fix this - we may want to receive 64kB SDUs later */ - cells = (vcc->qos.rxtp.max_sdu+ATM_AAL5_TRAILER+ - ATM_CELL_PAYLOAD-1)/ATM_CELL_PAYLOAD; + cells = DIV_ROUND_UP(vcc->qos.rxtp.max_sdu + ATM_AAL5_TRAILER, + ATM_CELL_PAYLOAD); zatm_vcc->pool = pool_index(cells*ATM_CELL_PAYLOAD); } else { @@ -820,7 +821,7 @@ static int alloc_shaper(struct atm_dev *dev,int *pcr,int min,int max,int ubr) } else { i = 255; - m = (ATM_OC3_PCR*255+max-1)/max; + m = DIV_ROUND_UP(ATM_OC3_PCR*255, max); } } if (i > m) { @@ -1093,8 +1094,8 @@ static irqreturn_t zatm_int(int irq,void *dev_id) /*----------------------------- (E)EPROM access -----------------------------*/ -static void __devinit eprom_set(struct zatm_dev *zatm_dev,unsigned long value, - unsigned short cmd) +static void eprom_set(struct zatm_dev *zatm_dev, unsigned long value, + unsigned short cmd) { int error; @@ -1104,8 +1105,7 @@ static void __devinit eprom_set(struct zatm_dev *zatm_dev,unsigned long value, } -static unsigned long __devinit eprom_get(struct zatm_dev *zatm_dev, - unsigned short cmd) +static unsigned long eprom_get(struct zatm_dev *zatm_dev, unsigned short cmd) { unsigned int value; int error; @@ -1117,8 +1117,8 @@ static unsigned long __devinit eprom_get(struct zatm_dev *zatm_dev, } -static void __devinit eprom_put_bits(struct zatm_dev *zatm_dev, - unsigned long data,int bits,unsigned short cmd) +static void eprom_put_bits(struct zatm_dev *zatm_dev, unsigned long data, + int bits, unsigned short cmd) { unsigned long value; int i; @@ -1132,8 +1132,8 @@ static void __devinit eprom_put_bits(struct zatm_dev *zatm_dev, } -static void __devinit eprom_get_byte(struct zatm_dev *zatm_dev, - unsigned char *byte,unsigned short cmd) +static void eprom_get_byte(struct zatm_dev *zatm_dev, unsigned char *byte, + unsigned short cmd) { int i; @@ -1148,8 +1148,8 @@ static void __devinit eprom_get_byte(struct zatm_dev *zatm_dev, } -static unsigned char __devinit eprom_try_esi(struct atm_dev *dev, - unsigned short cmd,int offset,int swap) +static unsigned char eprom_try_esi(struct atm_dev *dev, unsigned short cmd, + int offset, int swap) { unsigned char buf[ZEPROM_SIZE]; struct zatm_dev *zatm_dev; @@ -1169,7 +1169,7 @@ static unsigned char __devinit eprom_try_esi(struct atm_dev *dev, } -static void __devinit eprom_get_esi(struct atm_dev *dev) +static void eprom_get_esi(struct atm_dev *dev) { if (eprom_try_esi(dev,ZEPROM_V1_REG,ZEPROM_V1_ESI_OFF,1)) return; (void) eprom_try_esi(dev,ZEPROM_V2_REG,ZEPROM_V2_ESI_OFF,0); @@ -1179,7 +1179,7 @@ static void __devinit eprom_get_esi(struct atm_dev *dev) /*--------------------------------- entries ---------------------------------*/ -static int __devinit zatm_init(struct atm_dev *dev) +static int zatm_init(struct atm_dev *dev) { struct zatm_dev *zatm_dev; struct pci_dev *pci_dev; @@ -1256,7 +1256,7 @@ static int __devinit zatm_init(struct atm_dev *dev) } -static int __devinit zatm_start(struct atm_dev *dev) +static int zatm_start(struct atm_dev *dev) { struct zatm_dev *zatm_dev = ZATM_DEV(dev); struct pci_dev *pdev = zatm_dev->pci_dev; @@ -1517,7 +1517,7 @@ static int zatm_getsockopt(struct atm_vcc *vcc,int level,int optname, static int zatm_setsockopt(struct atm_vcc *vcc,int level,int optname, - void __user *optval,int optlen) + void __user *optval,unsigned int optlen) { return -EINVAL; } @@ -1583,8 +1583,8 @@ static const struct atmdev_ops ops = { .change_qos = zatm_change_qos, }; -static int __devinit zatm_init_one(struct pci_dev *pci_dev, - const struct pci_device_id *ent) +static int zatm_init_one(struct pci_dev *pci_dev, + const struct pci_device_id *ent) { struct atm_dev *dev; struct zatm_dev *zatm_dev; @@ -1596,7 +1596,7 @@ static int __devinit zatm_init_one(struct pci_dev *pci_dev, goto out; } - dev = atm_dev_register(DEV_LABEL, &ops, -1, NULL); + dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &ops, -1, NULL); if (!dev) goto out_free; @@ -1635,11 +1635,9 @@ out_free: MODULE_LICENSE("GPL"); -static struct pci_device_id zatm_pci_tbl[] __devinitdata = { - { PCI_VENDOR_ID_ZEITNET, PCI_DEVICE_ID_ZEITNET_1221, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, ZATM_COPPER }, - { PCI_VENDOR_ID_ZEITNET, PCI_DEVICE_ID_ZEITNET_1225, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, +static struct pci_device_id zatm_pci_tbl[] = { + { PCI_VDEVICE(ZEITNET, PCI_DEVICE_ID_ZEITNET_1221), ZATM_COPPER }, + { PCI_VDEVICE(ZEITNET, PCI_DEVICE_ID_ZEITNET_1225), 0 }, { 0, } }; MODULE_DEVICE_TABLE(pci, zatm_pci_tbl); |
