#include "rtl_rtl8139_drv.h"
#include "netif/net_policy/FIFO_policy.h"
#include "rt_pci.h"
Include dependency graph for rtl_rtl8139_drv.c:
Go to the source code of this file.
Defines | |
#define | RTL8139_MAJOR 205 |
#define | RTL8139_NAME "rtl" |
#define | RTL8139_SIGNAL RTL_SIGUSR1 |
#define | EE_SHIFT_CLK 0x04 |
#define | EE_CS 0x08 |
#define | EE_DATA_WRITE 0x02 |
#define | EE_WRITE_0 0x00 |
#define | EE_WRITE_1 0x02 |
#define | EE_DATA_READ 0x01 |
#define | EE_ENB (0x80 | EE_CS) |
#define | rt_rtl8139_eeprom_delay() readl(ee_addr) |
#define | EE_WRITE_CMD (5) |
#define | EE_READ_CMD (6) |
#define | EE_ERASE_CMD (7) |
Functions | |
MODULE_LICENSE ("GPL") | |
int | rt_rtl8139_read_eeprom (void *ioaddr, int location, int addr_len) |
int | rt_rtl8139_mdio_read (struct pci_dev *dev, int phy_id, int location) |
void | rt_rtl8139_mdio_write (struct pci_dev *dev, int phy_id, int location, int val) |
pci_dev * | init_rtl8139_device (void) |
int | start_up_rtl8139_device (struct pci_dev *dev) |
int | dev_rtl8139_open (struct pci_dev *dev) |
int | rt_rtl8139_open (struct rtl_file *filp) |
int | rt_rtl8139_release (struct rtl_file *filp) |
ssize_t | rt_rtl8139_write (struct rtl_file *filp, const char *buf, size_t count, loff_t *ppos) |
int | rt_rtl8139_ioctl (struct rtl_file *filp, unsigned int request, unsigned long other) |
ssize_t | rt_rtl8139_read (struct rtl_file *filp, char *buf, size_t count, loff_t *ppos) |
void | rt_rtl8139_send_signal (void) |
int | rt_rtl8139_obtain_mac_address (unsigned char *mac) |
int | rt_rtl8139_set_ip_filter (long ipaddr) |
void | rt_rtl8139_rx_interrupt (struct pci_dev *dev) |
int | rt_rtl8139_send_packet (const char *buffer, size_t size) |
void | rt_rtl8139_tx_interrupt (struct pci_dev *dev) |
unsigned int | rt_rtl8139_interrupt (unsigned int irq, struct pt_regs *regs) |
void | rt_rtl8139_mdio_sync (void *mdio_addr) |
u32 | rt_rtl8139_ether_crc (int length, unsigned char *data) |
void | rt_rtl8139_set_rx_mode (struct pci_dev *dev) |
void | rt_rtl8139_hw_start (struct pci_dev *dev) |
void | rt_rtl8139_init_ring (struct pci_dev *dev) |
void | rt_rtl8139_tx_clear (struct rtl8139_private rtl_8139_tp) |
int | rt_rtl8139_close (struct pci_dev *dev) |
void | rt_rtl8139_remove_one (struct pci_dev *pdev) |
int | init_module (void) |
void | cleanup_module (void) |
Variables | |
sem_t | rtl8139_sem |
net_policy_operations | rt_rtl8139_policy |
fifo_rx_buffer_t | rt_rtl8139_rx_buffer |
rtl_file_operations | rt_rtl8139_fops |
int | rt_rtl8139_inside_the_interrupt_handler = 0 rt_rtl8139_trying_to_close = 0 |
int | rt_rtl8139_interrupted = 0 rt_rtl8139_writting = 0 |
int | rt_rtl8139_max_interrupt_work = 20 |
unsigned char | rt_rtl8139_ip_addr [2][4] = {{0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00}} |
int | rt_rtl8139_n_filters = 0 |
unsigned char | rt_rtl8139_registered = 0x00 rt_rtl8139_opened = 0x00 rt_rtl8139_sended = 0x01 |
pci_dev * | rtl8139dev |
rtl8139_private | rtl_8139_tp |
unsigned const | ethernet_polynomial = 0x04c11db7U |
|
Definition at line 605 of file rtl_rtl8139_drv.c. Referenced by rt_rtl8139_read_eeprom(). |
|
Definition at line 609 of file rtl_rtl8139_drv.c. Referenced by rt_rtl8139_read_eeprom(). |
|
Definition at line 606 of file rtl_rtl8139_drv.c. Referenced by rt_rtl8139_read_eeprom(). |
|
Definition at line 610 of file rtl_rtl8139_drv.c. Referenced by rt_rtl8139_read_eeprom(). |
|
Definition at line 621 of file rtl_rtl8139_drv.c. |
|
Definition at line 620 of file rtl_rtl8139_drv.c. Referenced by rt_rtl8139_read_eeprom(). |
|
Definition at line 604 of file rtl_rtl8139_drv.c. Referenced by rt_rtl8139_read_eeprom(). |
|
Definition at line 607 of file rtl_rtl8139_drv.c. |
|
Definition at line 608 of file rtl_rtl8139_drv.c. |
|
Definition at line 619 of file rtl_rtl8139_drv.c. |
|
Definition at line 616 of file rtl_rtl8139_drv.c. Referenced by rt_rtl8139_read_eeprom(). |
|
Definition at line 163 of file rtl_rtl8139_drv.c. Referenced by cleanup_module(), init_module(), and rt_rtl8139_open(). |
|
Definition at line 164 of file rtl_rtl8139_drv.c. Referenced by cleanup_module(), and init_module(). |
|
Definition at line 165 of file rtl_rtl8139_drv.c. |
|
Definition at line 1287 of file rtl_rtl8139_drv.c. References rtl8139_private::pci_dev, rt_rtl8139_inside_the_interrupt_handler, rt_rtl8139_registered, RTL8139_MAJOR, RTL8139_NAME, and rtl_8139_tp.
01287 { 01288 01289 int inside = 1; 01290 rtl_irqstate_t state; 01291 01292 if((rt_rtl8139_opened == 0x01) || rt_rtl8139_inside_the_interrupt_handler){ 01293 01294 rt_rtl8139_trying_to_close = 1; 01295 01296 /* Since inside the interrupt handler there's a call to the scheduler, there may */ 01297 /* be an execution of the interrupt handler that hasn't been completely executed. */ 01298 /* The card cannot be released in that case, so we must be sure that there is no */ 01299 /* interrupt handler execution pending. Otherwise, that may crash the system. */ 01300 while(inside){ 01301 rtl_no_interrupts(state); 01302 01303 if(rt_rtl8139_inside_the_interrupt_handler){ 01304 rtl_restore_interrupts(state); 01305 usleep(10); 01306 }else{ 01307 rtl_hard_disable_irq(rtl_8139_tp.pci_dev->irq); 01308 rtl_restore_interrupts(state); 01309 inside = 0; 01310 } 01311 } 01312 } 01313 01314 if(rt_rtl8139_registered == 0x01){ 01315 printk("Unregistering device /dev/%s\n",RTL8139_NAME); 01316 rtl_unregister_rtldev(RTL8139_MAJOR,RTL8139_NAME); 01317 } 01318 printk("\n\n\nRT-Linux driver for the Ethernet Card rtl8139 being removed\n\n\n"); 01319 } |
|
Definition at line 827 of file rtl_rtl8139_drv.c. References rtl8139_private::duplex_lock, rtl8139_private::full_duplex, MediaStatus, rtl8139_private::mmio_addr, rtl8139_private::must_free_irq, NULL, rtl8139_private::pci_dev, rt_rtl8139_hw_start(), rt_rtl8139_init_ring(), rt_rtl8139_interrupt(), rtl_8139_tp, RTL_R8, RX_BUF_TOT_LEN, rtl8139_private::rx_ring, rtl8139_private::rx_ring_dma, rtl8139_private::thr_pid, rtl8139_private::twistie, TX_BUF_TOT_LEN, rtl8139_private::tx_bufs, rtl8139_private::tx_bufs_dma, TX_FIFO_THRESH, and rtl8139_private::tx_flag. Referenced by start_up_rtl8139_device().
00828 { 00829 int retval; 00830 long ioaddr; 00831 ioaddr = (long)rtl_8139_tp.mmio_addr; 00832 00833 00834 retval = rtl_request_irq (dev->irq, &rt_rtl8139_interrupt); 00835 if (retval) { 00836 rtl_printf ("rtl_request_irq : EXIT, returning %d\n", retval); 00837 return retval; 00838 } else rtl_8139_tp.must_free_irq = 1; 00839 00840 rtl_8139_tp.tx_bufs = pci_alloc_consistent(rtl_8139_tp.pci_dev, TX_BUF_TOT_LEN, 00841 &rtl_8139_tp.tx_bufs_dma); 00842 rtl_8139_tp.rx_ring = pci_alloc_consistent(rtl_8139_tp.pci_dev, RX_BUF_TOT_LEN, 00843 &rtl_8139_tp.rx_ring_dma); 00844 if (rtl_8139_tp.tx_bufs == NULL || rtl_8139_tp.rx_ring == NULL) { 00845 rtl_free_irq(dev->irq); 00846 00847 if (rtl_8139_tp.tx_bufs) 00848 pci_free_consistent(rtl_8139_tp.pci_dev, TX_BUF_TOT_LEN, 00849 rtl_8139_tp.tx_bufs, rtl_8139_tp.tx_bufs_dma); 00850 if (rtl_8139_tp.rx_ring) 00851 pci_free_consistent(rtl_8139_tp.pci_dev, RX_BUF_TOT_LEN, 00852 rtl_8139_tp.rx_ring, rtl_8139_tp.rx_ring_dma); 00853 00854 rtl_printf ("EXIT, returning -ENOMEM\n"); 00855 return -ENOMEM; 00856 00857 } 00858 rtl_8139_tp.full_duplex = rtl_8139_tp.duplex_lock; 00859 rtl_8139_tp.tx_flag = (TX_FIFO_THRESH << 11) & 0x003f0000; 00860 rtl_8139_tp.twistie = 1; 00861 00862 rt_rtl8139_init_ring (dev); 00863 rt_rtl8139_hw_start (dev); 00864 00865 rtl_printf ("%s: dev_8139_open() ioaddr %#lx IRQ %d" 00866 " GP Pins %2.2x %s-duplex.\n", 00867 dev->name, pci_resource_start (rtl_8139_tp.pci_dev, 1), 00868 dev->irq, RTL_R8 (MediaStatus), 00869 rtl_8139_tp.full_duplex ? "full" : "half"); 00870 00871 if (rtl_8139_tp.thr_pid < 0) 00872 rtl_printf ( "%s: unable to start kernel thread\n", 00873 dev->name); 00874 00875 return 0; 00876 } |
Here is the call graph for this function:
|
Definition at line 1272 of file rtl_rtl8139_drv.c. References rt_rtl8139_fops, rt_rtl8139_registered, RTL8139_MAJOR, and RTL8139_NAME.
01272 { 01273 printk("\n\n\nRT-Linux driver for the Ethernet Card rtl8139 being loaded\n\n\n"); 01274 01275 if (rtl_register_rtldev (RTL8139_MAJOR, RTL8139_NAME, &rt_rtl8139_fops)) { 01276 printk ("RTLinux /dev/%s: unable to get RTLinux major %d\n", RTL8139_NAME, RTL8139_MAJOR); 01277 return -EIO; 01278 }else{ 01279 printk("Registered device /dev/%s major number %d\n",RTL8139_NAME, RTL8139_MAJOR); 01280 rt_rtl8139_registered = 0x01; 01281 return 0; 01282 } 01283 } |
|
Definition at line 1251 of file rtl_rtl8139_drv.c. References net_policy_operations::initialize_rx_buffer, NULL, rt_pci_enable_device(), rt_pci_find_device(), rt_rtl8139_policy, rt_rtl8139_rx_buffer, RTL8139_DEVICE_ID, and RTL8139_VENDOR_ID. Referenced by rt_rtl8139_open().
01251 { 01252 struct pci_dev *dev; 01253 01254 /* First of all, we must get a pointer to the pci_dev structure */ 01255 if((dev = rt_pci_find_device(RTL8139_VENDOR_ID, RTL8139_DEVICE_ID, NULL))== NULL) 01256 return NULL; 01257 01258 rt_rtl8139_policy.initialize_rx_buffer(&rt_rtl8139_rx_buffer); 01259 01260 /* Let's enable the device */ 01261 if (rt_pci_enable_device(dev)){ 01262 rtl_printf("PCI ERROR: Can't enable device\n"); 01263 return NULL; 01264 } 01265 01266 return dev; 01267 } |
Here is the call graph for this function:
|
|
|
Definition at line 1115 of file rtl_rtl8139_drv.c. References Cfg9346, Cfg9346_Unlock, ChipCmd, ChipCmdClear, Config1, HltClk, IntrMask, IntrStatus, rtl8139_private::mmio_addr, rtl8139_private::must_free_irq, NULL, rtl8139_private::pci_dev, rt_rtl8139_tx_clear(), rtl_8139_tp, RTL_R16, RTL_R32, RTL_R8, RTL_W16, RTL_W32, RTL_W8, RX_BUF_TOT_LEN, rtl8139_private::rx_ring, rtl8139_private::rx_ring_dma, RxMissed, rtl8139_private::stats, TX_BUF_TOT_LEN, rtl8139_private::tx_bufs, and rtl8139_private::tx_bufs_dma. Referenced by rt_rtl8139_release().
01116 { 01117 void *ioaddr = rtl_8139_tp.mmio_addr; 01118 01119 rtl_printf ("%s: Shutting down ethercard, status was 0x%4.4x.\n", dev->name, RTL_R16 (IntrStatus)); 01120 01121 /* Stop the chip's Tx and Rx DMA processes. */ 01122 RTL_W8 (ChipCmd, (RTL_R8 (ChipCmd) & ChipCmdClear)); 01123 01124 /* Disable interrupts by clearing the interrupt mask. */ 01125 RTL_W16 (IntrMask, 0x0000); 01126 01127 /* Update the error counts. */ 01128 rtl_8139_tp.stats.rx_missed_errors += RTL_R32 (RxMissed); 01129 RTL_W32 (RxMissed, 0); 01130 01131 if(rtl_8139_tp.must_free_irq) { 01132 rtl_free_irq (dev->irq); 01133 rtl_8139_tp.must_free_irq = 0; 01134 } 01135 01136 rt_rtl8139_tx_clear(rtl_8139_tp); 01137 pci_free_consistent(rtl_8139_tp.pci_dev, RX_BUF_TOT_LEN,rtl_8139_tp.rx_ring, rtl_8139_tp.rx_ring_dma); 01138 pci_free_consistent(rtl_8139_tp.pci_dev, TX_BUF_TOT_LEN,rtl_8139_tp.tx_bufs, rtl_8139_tp.tx_bufs_dma); 01139 rtl_8139_tp.rx_ring = NULL; 01140 rtl_8139_tp.tx_bufs = NULL; 01141 01142 /* Green! Put the chip in low-power mode. */ 01143 RTL_W8 (Cfg9346, Cfg9346_Unlock); 01144 RTL_W8 (Config1, 0x03); 01145 RTL_W8 (HltClk, 'H'); /* 'R' would leave the clock running. */ 01146 01147 return 0; 01148 } |
Here is the call graph for this function:
|
Definition at line 668 of file rtl_rtl8139_drv.c. References data, and ethernet_polynomial.
00669 { 00670 int crc = -1; 00671 00672 00673 while (--length >= 0) { 00674 unsigned char current_octet = *data++; 00675 int bit; 00676 for (bit = 0; bit < 8; bit++, current_octet >>= 1) 00677 crc = (crc << 1) ^ ((crc < 0) ^ (current_octet & 1) ? 00678 ethernet_polynomial : 0); 00679 } 00680 00681 return crc; 00682 } |
|
Definition at line 708 of file rtl_rtl8139_drv.c. References Cfg1_Driver_Load, Cfg9346, Cfg9346_Lock, Cfg9346_Unlock, CH_8139A, CH_8139B, ChipCmd, ChipCmdClear, rtl8139_private::chipset, CmdReset, CmdRxEnb, CmdTxEnb, Config1, Config1Clear, Config3, Config4, rtl8139_private::cur_rx, rtl8139_private::dev_addr, rtl8139_private::drv_flags, rtl8139_private::full_duplex, HAS_MII_XCVR, IntrMask, MAC0, rtl8139_private::mmio_addr, MultiIntr, MultiIntrClear, NUM_TX_DESC, rtl8139_private::phys, rt_rtl8139_mdio_read(), rt_rtl8139_set_rx_mode(), rtl_8139_tp, RTL_R16, RTL_R32, RTL_R8, RTL_W16, RTL_W16_F, RTL_W32, RTL_W32_F, RTL_W8, RTL_W8_F, rtl8139_private::rx_ring_dma, RxBuf, RxConfig, RxMissed, rtl8139_private::tx_buf, rtl8139_private::tx_bufs, rtl8139_private::tx_bufs_dma, TX_DMA_BURST, TxAddr0, TxConfig, and TxDMAShift. Referenced by dev_rtl8139_open().
00709 { 00710 void *ioaddr = rtl_8139_tp.mmio_addr; 00711 u32 i; 00712 u8 tmp; 00713 00714 00715 /* Soft reset the chip. */ 00716 RTL_W8 (ChipCmd, (RTL_R8 (ChipCmd) & ChipCmdClear) | CmdReset); 00717 rtl_delay (100); 00718 00719 /* Check that the chip has finished the reset. */ 00720 for (i = 1000; i > 0; i--) 00721 if ((RTL_R8 (ChipCmd) & CmdReset) == 0) 00722 break; 00723 00724 /* unlock Config[01234] and BMCR register writes */ 00725 RTL_W8_F (Cfg9346, Cfg9346_Unlock); 00726 /* Restore our idea of the MAC address. */ 00727 RTL_W32_F (MAC0 + 0, cpu_to_le32 (*(u32 *) (rtl_8139_tp.dev_addr + 0))); 00728 RTL_W32_F (MAC0 + 4, cpu_to_le32 (*(u32 *) (rtl_8139_tp.dev_addr + 4))); 00729 00730 /* Must enable Tx/Rx before setting transfer thresholds! */ 00731 RTL_W8_F (ChipCmd, (RTL_R8 (ChipCmd) & ChipCmdClear) | 00732 CmdRxEnb | CmdTxEnb); 00733 00734 i = rtl8139_rx_config | 00735 (RTL_R32 (RxConfig) & rtl_chip_info[rtl_8139_tp.chipset].RxConfigMask); 00736 RTL_W32_F (RxConfig, i); 00737 00738 /* Check this value: the documentation for IFG contradicts ifself. */ 00739 RTL_W32 (TxConfig, (TX_DMA_BURST << TxDMAShift)); 00740 00741 rtl_8139_tp.cur_rx = 0; 00742 00743 /* This is check_duplex() */ 00744 if (rtl_8139_tp.phys[0] >= 0 || (rtl_8139_tp.drv_flags & HAS_MII_XCVR)) { 00745 u16 mii_reg5 = rt_rtl8139_mdio_read(dev, rtl_8139_tp.phys[0], 5); 00746 if (mii_reg5 == 0xffff) 00747 ; /* Not there */ 00748 else if ((mii_reg5 & 0x0100) == 0x0100 00749 || (mii_reg5 & 0x00C0) == 0x0040) 00750 rtl_8139_tp.full_duplex = 1; 00751 rtl_printf("%s: Setting %s%s-duplex based on" 00752 " auto-negotiated partner ability %4.4x.\n", dev->name, 00753 mii_reg5 == 0 ? "" : 00754 (mii_reg5 & 0x0180) ? "100mbps " : "10mbps ", 00755 rtl_8139_tp.full_duplex ? "full" : "half", mii_reg5); 00756 } 00757 if (rtl_8139_tp.chipset >= CH_8139A) { 00758 tmp = RTL_R8 (Config1) & Config1Clear; 00759 tmp |= Cfg1_Driver_Load; 00760 tmp |= (rtl_8139_tp.chipset == CH_8139B) ? 3 : 1; /* Enable PM/VPD */ 00761 RTL_W8_F (Config1, tmp); 00762 } else { 00763 u8 foo = RTL_R8 (Config1) & Config1Clear; 00764 RTL_W8 (Config1, rtl_8139_tp.full_duplex ? (foo|0x60) : (foo|0x20)); 00765 } 00766 00767 if (rtl_8139_tp.chipset >= CH_8139B) { 00768 tmp = RTL_R8 (Config4) & ~(1<<2); 00769 /* chip will clear Rx FIFO overflow automatically */ 00770 tmp |= (1<<7); 00771 RTL_W8 (Config4, tmp); 00772 00773 /* disable magic packet scanning, which is enabled 00774 * when PM is enabled above (Config1) */ 00775 RTL_W8 (Config3, RTL_R8 (Config3) & ~(1<<5)); 00776 } 00777 00778 /* Lock Config[01234] and BMCR register writes */ 00779 RTL_W8_F (Cfg9346, Cfg9346_Lock); 00780 rtl_delay (10); 00781 00782 /* init Rx ring buffer DMA address */ 00783 RTL_W32_F (RxBuf, rtl_8139_tp.rx_ring_dma); 00784 00785 /* init Tx buffer DMA addresses */ 00786 for (i = 0; i < NUM_TX_DESC; i++) 00787 RTL_W32_F (TxAddr0 + (i * 4), rtl_8139_tp.tx_bufs_dma + (rtl_8139_tp.tx_buf[i] - rtl_8139_tp.tx_bufs)); 00788 RTL_W32_F (RxMissed, 0); 00789 00790 rt_rtl8139_set_rx_mode (dev); 00791 00792 /* no early-rx interrupts */ 00793 RTL_W16 (MultiIntr, RTL_R16 (MultiIntr) & MultiIntrClear); 00794 00795 /* make sure RxTx has started */ 00796 RTL_W8_F (ChipCmd, (RTL_R8 (ChipCmd) & ChipCmdClear) | 00797 CmdRxEnb | CmdTxEnb); 00798 00799 /* Enable all known interrupts by setting the interrupt mask. */ 00800 RTL_W16_F (IntrMask, rtl8139_intr_mask); 00801 00802 00803 } |
Here is the call graph for this function:
|
Definition at line 808 of file rtl_rtl8139_drv.c. References rtl8139_private::cur_rx, rtl8139_private::cur_tx, rtl8139_private::dirty_tx, ring_info::mapping, NULL, NUM_TX_DESC, rtl_8139_tp, ring_info::skb, rtl8139_private::tx_buf, TX_BUF_SIZE, rtl8139_private::tx_bufs, and rtl8139_private::tx_info. Referenced by dev_rtl8139_open().
00809 { 00810 int i; 00811 00812 00813 rtl_8139_tp.cur_rx = 0; 00814 rtl_8139_tp.cur_tx = 0; 00815 rtl_8139_tp.dirty_tx = 0; 00816 00817 for (i = 0; i < NUM_TX_DESC; i++) { 00818 rtl_8139_tp.tx_info[i].skb = NULL; 00819 rtl_8139_tp.tx_info[i].mapping = 0; 00820 rtl_8139_tp.tx_buf[i] = &rtl_8139_tp.tx_bufs[i * TX_BUF_SIZE]; 00821 } 00822 00823 } |
|
Definition at line 440 of file rtl_rtl8139_drv.c. References CSCR, CSCR_LinkChangeBit, IntrStatus, rtl8139_private::mmio_addr, rtl8139_private::pci_dev, PCIErr, PCSTimeout, rt_rtl8139_inside_the_interrupt_handler, rt_rtl8139_interrupted, rt_rtl8139_max_interrupt_work, rt_rtl8139_rx_interrupt(), rt_rtl8139_tx_interrupt(), rtl8139dev, rtl_8139_tp, RTL_R16, RTL_W16, RTL_W16_F, RxErr, RxFIFOOver, RxOK, RxOverflow, RxUnderrun, status, TxErr, and TxOK. Referenced by dev_rtl8139_open().
00441 { 00442 00443 struct pci_dev *dev = rtl8139dev; 00444 int boguscnt = rt_rtl8139_max_interrupt_work; 00445 void *ioaddr = rtl_8139_tp.mmio_addr; 00446 int status = 0, link_changed = 0; /* avoid bogus "uninit" warning */ 00447 00448 rt_rtl8139_inside_the_interrupt_handler = 1; 00449 rt_rtl8139_interrupted++; 00450 00451 do { 00452 status = RTL_R16 (IntrStatus); 00453 00454 /* h/w no longer present (hotplug?) or major error, bail */ 00455 if (status == 0xFFFF) 00456 break; 00457 /* Acknowledge all of the current interrupt sources ASAP, but 00458 an first get an additional status bit from CSCR. */ 00459 if (status & RxUnderrun) 00460 link_changed = RTL_R16 (CSCR) & CSCR_LinkChangeBit; 00461 00462 RTL_W16_F (IntrStatus, (status & RxFIFOOver) ? (status | RxOverflow) : status); 00463 00464 if ((status & 00465 (PCIErr | PCSTimeout | RxUnderrun | RxOverflow | 00466 RxFIFOOver | TxErr | TxOK | RxErr | RxOK)) == 0) { 00467 break; 00468 } 00469 00470 if (status & (RxOK | RxUnderrun | RxOverflow | RxFIFOOver)) { /* Rx interrupt */ 00471 rt_rtl8139_rx_interrupt (dev); 00472 } 00473 00474 if (status & (TxOK | TxErr)) { 00475 rt_rtl8139_tx_interrupt (dev); 00476 } 00477 00478 boguscnt--; 00479 } while (boguscnt > 0); 00480 00481 if (boguscnt <= 0) { 00482 rtl_printf ( "%s: Too much work at interrupt, " 00483 "IntrStatus=0x%4.4x.\n", dev->name, 00484 status); 00485 00486 /* Clear all interrupt sources. */ 00487 RTL_W16 (IntrStatus, 0xffff); 00488 } 00489 if(!rt_rtl8139_trying_to_close){ 00490 rtl_hard_enable_irq(rtl_8139_tp.pci_dev->irq); 00491 } 00492 00493 rt_rtl8139_interrupted--; 00494 00495 return (rt_rtl8139_inside_the_interrupt_handler = 0); 00496 } |
Here is the call graph for this function:
|
Definition at line 1172 of file rtl_rtl8139_drv.c. References rt_rtl8139_obtain_mac_address(), and rt_rtl8139_set_ip_filter().
01172 { 01173 01174 01175 switch(request) { 01176 case 1: /* set_ip_filter */ 01177 rt_rtl8139_set_ip_filter(other); 01178 break; 01179 case 2: /* obtain_mac_address */ 01180 rt_rtl8139_obtain_mac_address((unsigned char *)other); 01181 break; 01182 } 01183 return 0; 01184 } |
Here is the call graph for this function:
|
Definition at line 516 of file rtl_rtl8139_drv.c. References Config4, MDIO_CLK, MDIO_DATA_IN, MDIO_DATA_OUT, MDIO_DIR, rtl8139_private::mmio_addr, rt_rtl8139_mdio_delay, rt_rtl8139_mdio_sync(), and rtl_8139_tp. Referenced by rt_rtl8139_hw_start(), and start_up_rtl8139_device().
00517 { 00518 void *mdio_addr = rtl_8139_tp.mmio_addr + Config4; 00519 int mii_cmd = (0xf6 << 10) | (phy_id << 5) | location; 00520 int retval = 0; 00521 int i; 00522 00523 00524 if (phy_id > 31) { /* Really a 8139. Use internal registers. */ 00525 return location < 8 && mii_2_8139_map[location] ? 00526 readw (rtl_8139_tp.mmio_addr + mii_2_8139_map[location]) : 0; 00527 } 00528 rt_rtl8139_mdio_sync (mdio_addr); 00529 /* Shift the read command bits out. */ 00530 for (i = 15; i >= 0; i--) { 00531 int dataval = (mii_cmd & (1 << i)) ? MDIO_DATA_OUT : 0; 00532 00533 writeb (MDIO_DIR | dataval, mdio_addr); 00534 rt_rtl8139_mdio_delay (mdio_addr); 00535 writeb (MDIO_DIR | dataval | MDIO_CLK, mdio_addr); 00536 rt_rtl8139_mdio_delay (mdio_addr); 00537 } 00538 00539 /* Read the two transition, 16 data, and wire-idle bits. */ 00540 for (i = 19; i > 0; i--) { 00541 writeb (0, mdio_addr); 00542 rt_rtl8139_mdio_delay (mdio_addr); 00543 retval = (retval << 1) | ((readb (mdio_addr) & MDIO_DATA_IN) ? 1 : 0); 00544 writeb (MDIO_CLK, mdio_addr); 00545 rt_rtl8139_mdio_delay (mdio_addr); 00546 } 00547 00548 return (retval >> 1) & 0xffff; 00549 } |
Here is the call graph for this function:
|
Definition at line 501 of file rtl_rtl8139_drv.c. References MDIO_CLK, MDIO_WRITE1, and rt_rtl8139_mdio_delay. Referenced by rt_rtl8139_mdio_read(), and rt_rtl8139_mdio_write().
00502 { 00503 int i; 00504 00505 00506 for (i = 32; i >= 0; i--) { 00507 writeb (MDIO_WRITE1, mdio_addr); 00508 rt_rtl8139_mdio_delay (mdio_addr); 00509 writeb (MDIO_WRITE1 | MDIO_CLK, mdio_addr); 00510 rt_rtl8139_mdio_delay (mdio_addr); 00511 } 00512 00513 } |
|
Definition at line 552 of file rtl_rtl8139_drv.c. References rtl8139_private::AutoNegoAbility, AutoNegoAbility100full, AutoNegoAbility100half, AutoNegoAbility10full, AutoNegoAbility10half, AutoNegotiationEnable, AutoNegotiationRestart, BasicModeCtrl, Cfg9346, Cfg9346_Lock, Cfg9346_Unlock, Config4, MDIO_CLK, MDIO_WRITE0, MDIO_WRITE1, rtl8139_private::mmio_addr, NWayAdvert, rt_rtl8139_mdio_delay, rt_rtl8139_mdio_sync(), rtl_8139_tp, RTL_W16, RTL_W16_F, and RTL_W8_F. Referenced by start_up_rtl8139_device().
00554 { 00555 void *mdio_addr = rtl_8139_tp.mmio_addr + Config4; 00556 int mii_cmd = (0x5002 << 16) | (phy_id << 23) | (location << 18) | value; 00557 int i; 00558 00559 00560 if (phy_id > 31) { /* Really a 8139. Use internal registers. */ 00561 void *ioaddr = rtl_8139_tp.mmio_addr; 00562 if (location == 0) { 00563 RTL_W8_F (Cfg9346, Cfg9346_Unlock); 00565 switch(rtl_8139_tp.AutoNegoAbility){ 00566 case 1: RTL_W16 (NWayAdvert, AutoNegoAbility10half); break; 00567 case 2: RTL_W16 (NWayAdvert, AutoNegoAbility10full); break; 00568 case 4: RTL_W16 (NWayAdvert, AutoNegoAbility100half); break; 00569 case 8: RTL_W16 (NWayAdvert, AutoNegoAbility100full); break; 00570 default: break; 00571 } 00572 RTL_W16_F (BasicModeCtrl, AutoNegotiationEnable|AutoNegotiationRestart); 00574 RTL_W8_F (Cfg9346, Cfg9346_Lock); 00575 } else if (location < 8 && mii_2_8139_map[location]) 00576 RTL_W16_F (mii_2_8139_map[location], value); 00577 00578 return; 00579 } 00580 rt_rtl8139_mdio_sync (mdio_addr); 00581 /* Shift the command bits out. */ 00582 for (i = 31; i >= 0; i--) { 00583 int dataval = 00584 (mii_cmd & (1 << i)) ? MDIO_WRITE1 : MDIO_WRITE0; 00585 writeb (dataval, mdio_addr); 00586 rt_rtl8139_mdio_delay (mdio_addr); 00587 writeb (dataval | MDIO_CLK, mdio_addr); 00588 rt_rtl8139_mdio_delay (mdio_addr); 00589 } 00590 /* Clear out extra bits. */ 00591 for (i = 2; i > 0; i--) { 00592 writeb (0, mdio_addr); 00593 rt_rtl8139_mdio_delay (mdio_addr); 00594 writeb (MDIO_CLK, mdio_addr); 00595 rt_rtl8139_mdio_delay (mdio_addr); 00596 } 00597 return; 00598 } |
Here is the call graph for this function:
|
Definition at line 207 of file rtl_rtl8139_drv.c. References rtl8139_private::dev_addr, and rtl_8139_tp. Referenced by rt_rtl8139_ioctl().
00207 { 00208 int i; 00209 for(i=0; i<6; i++) 00210 mac[i]=rtl_8139_tp.dev_addr[i]; 00211 return 0; 00212 } |
|
Definition at line 1229 of file rtl_rtl8139_drv.c. References init_rtl8139_device(), NULL, RTL8139_MAJOR, rtl8139_sem, rtl8139dev, and start_up_rtl8139_device().
01229 { 01230 01231 01232 if(rt_rtl8139_opened == 0x00){ 01233 if((rtl8139dev = init_rtl8139_device())!=NULL){ 01234 sem_init(&rtl8139_sem, 0, 0); 01235 01236 start_up_rtl8139_device(rtl8139dev); 01237 rt_rtl8139_opened = 0x01; 01238 rtl_printf("Successfully Opened\n"); 01239 return RTL8139_MAJOR; 01240 }else{ 01241 rtl_printf("ERROR: Couldn't initialize device\n"); 01242 return -1; 01243 } 01244 }else{ 01245 rtl_printf("Device is already opened\n"); 01246 return -1; 01247 } 01248 } |
Here is the call graph for this function:
|
Definition at line 1165 of file rtl_rtl8139_drv.c. References net_policy_operations::extract_frame_of_buffer, rt_rtl8139_policy, rt_rtl8139_rx_buffer, and rtl8139_sem.
01165 { 01166 sem_wait(&rtl8139_sem); 01167 return rt_rtl8139_policy.extract_frame_of_buffer(&rt_rtl8139_rx_buffer,buf); 01168 } |
|
Definition at line 623 of file rtl_rtl8139_drv.c. References Cfg9346, EE_CS, EE_DATA_READ, EE_DATA_WRITE, EE_ENB, EE_READ_CMD, EE_SHIFT_CLK, and rt_rtl8139_eeprom_delay. Referenced by start_up_rtl8139_device().
00624 { 00625 int i; 00626 unsigned retval = 0; 00627 void *ee_addr = ioaddr + Cfg9346; 00628 int read_cmd = location | (EE_READ_CMD << addr_len); 00629 00630 00631 writeb (EE_ENB & ~EE_CS, ee_addr); 00632 writeb (EE_ENB, ee_addr); 00633 rt_rtl8139_eeprom_delay (); 00634 00635 /* Shift the read command bits out. */ 00636 for (i = 4 + addr_len; i >= 0; i--) { 00637 int dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0; 00638 writeb (EE_ENB | dataval, ee_addr); 00639 rt_rtl8139_eeprom_delay (); 00640 writeb (EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); 00641 rt_rtl8139_eeprom_delay (); 00642 } 00643 writeb (EE_ENB, ee_addr); 00644 rt_rtl8139_eeprom_delay (); 00645 00646 for (i = 16; i > 0; i--) { 00647 writeb (EE_ENB | EE_SHIFT_CLK, ee_addr); 00648 rt_rtl8139_eeprom_delay (); 00649 retval = 00650 (retval << 1) | ((readb (ee_addr) & EE_DATA_READ) ? 1 : 00651 0); 00652 writeb (EE_ENB, ee_addr); 00653 rt_rtl8139_eeprom_delay (); 00654 } 00655 00656 /* Terminate the EEPROM access. */ 00657 writeb (~EE_CS, ee_addr); 00658 rt_rtl8139_eeprom_delay (); 00659 00660 return retval; 00661 } |
|
Definition at line 1187 of file rtl_rtl8139_drv.c. References net_policy_operations::dealloc_rx_buffer, rt_rtl8139_close(), rt_rtl8139_policy, rt_rtl8139_remove_one(), rt_rtl8139_rx_buffer, rtl8139_sem, and rtl8139dev.
01187 { 01188 rtl_irqstate_t state; 01189 rtl_no_interrupts(state); 01190 01191 rtl_printf("rtl8139_close\n"); 01192 01193 rt_rtl8139_close(rtl8139dev); 01194 01195 rtl_printf("rtl8139_remove_one\n"); 01196 01197 rt_rtl8139_remove_one (rtl8139dev); 01198 01199 if(rt_rtl8139_opened == 0x01){ 01200 sem_destroy(&rtl8139_sem); 01201 rtl_printf("Deallocating rx_buffer\n"); 01202 rt_rtl8139_policy.dealloc_rx_buffer(&rt_rtl8139_rx_buffer); 01203 } 01204 01205 rtl_printf("After deallocating rx_buffer\n"); 01206 01207 rt_rtl8139_opened = 0x00; 01208 rtl_restore_interrupts(state); 01209 01210 return 0; 01211 } |
Here is the call graph for this function:
|
Definition at line 1151 of file rtl_rtl8139_drv.c. References rtl8139_private::mmio_addr, and rtl_8139_tp. Referenced by rt_rtl8139_release().
01152 { 01153 long io_addr; 01154 io_addr = (long)rtl_8139_tp.mmio_addr; 01155 01156 iounmap (rtl_8139_tp.mmio_addr); 01157 01158 pci_release_regions (pdev); 01159 } |
|
Definition at line 232 of file rtl_rtl8139_drv.c. References net_policy_operations::add_frame_to_buffer, ChipCmd, rtl8139_private::cur_rx, rtl8139_private::dev_addr, MAX_ETH_FRAME_SIZE, rtl8139_private::mmio_addr, rt_rtl8139_ip_addr, rt_rtl8139_n_filters, rt_rtl8139_policy, rt_rtl8139_rx_buffer, rtl8139_sem, rtl_8139_tp, RTL_R8, RTL_W16_F, RX_BUF_LEN, rtl8139_private::rx_frames_for_us, rtl8139_private::rx_ring, RxBufEmpty, RxBufPtr, RxStatusOK, and rtl8139_private::stats. Referenced by rt_rtl8139_interrupt().
00233 { 00234 unsigned char *rx_ring; 00235 u16 cur_rx; 00236 unsigned char mine = 0x01; 00237 unsigned char multicast_packet= 0x01; 00238 unsigned char arp_request_for_me = 0x01 ; 00239 void *ioaddr = rtl_8139_tp.mmio_addr; 00240 int i, j; 00241 00242 00243 rx_ring = rtl_8139_tp.rx_ring; 00244 cur_rx = rtl_8139_tp.cur_rx; 00245 00246 while ((RTL_R8 (ChipCmd) & RxBufEmpty) == 0) { 00247 int ring_offset = cur_rx % RX_BUF_LEN; 00248 u32 rx_status; 00249 unsigned int rx_size; 00250 unsigned int pkt_size; 00251 unsigned char *skb; 00252 00253 /* read size+status of next frame from DMA ring buffer */ 00254 rx_status = le32_to_cpu (*(u32 *) (rx_ring + ring_offset)); 00255 rx_size = rx_status >> 16; 00256 pkt_size = rx_size - 4; 00257 00258 if (rx_size == 0xfff0) 00259 break; 00260 00261 if ((rx_size > (MAX_ETH_FRAME_SIZE+4)) || (!(rx_status & RxStatusOK))) { 00262 return; 00263 } 00264 00265 skb = &rx_ring[ring_offset+4]; 00266 rtl_8139_tp.stats.rx_bytes += pkt_size; 00267 00268 rtl_8139_tp.stats.rx_packets++; 00269 00270 for(i=0; i<6; i++){ 00271 if(skb[i] == rtl_8139_tp.dev_addr[i]) { 00272 continue; 00273 } else{ 00274 mine = 0x00; 00275 break; 00276 } 00277 } 00278 00279 if(mine == 0x01) { 00280 goto accept_frame; 00281 } 00282 00283 if((skb[12]==0x08) && (skb[13]==0x06)){ 00284 for(j=0; j<rt_rtl8139_n_filters; j++){ 00285 for(i=0; i<4;i++){ 00286 if(skb[38+i]==rt_rtl8139_ip_addr[j][i]) { 00287 continue; 00288 } else{ 00289 arp_request_for_me = 0x00; 00290 break; 00291 } 00292 } 00293 } 00294 }else 00295 arp_request_for_me = 0x00; 00296 00297 00298 for(i=0; i<6; i++){ 00299 if(skb[i] == 0xff) 00300 continue; 00301 else{ 00302 multicast_packet = 0x00; 00303 break; 00304 } 00305 } 00306 00307 accept_frame: 00308 if((mine == 0x01) || ((multicast_packet==0x01) && (arp_request_for_me==0x01))){ 00309 rtl_8139_tp.rx_frames_for_us++; 00310 if(rt_rtl8139_policy.add_frame_to_buffer(&rt_rtl8139_rx_buffer,skb,pkt_size)== 0){ 00311 sem_post(&rtl8139_sem); 00312 00313 rtl_schedule(); 00314 } 00315 } 00316 00317 cur_rx = (cur_rx + rx_size + 4 + 3) & ~3; 00318 RTL_W16_F (RxBufPtr, cur_rx - 16); 00319 00320 mine = 0x01; 00321 multicast_packet= 0x01; 00322 arp_request_for_me = 0x01 ; 00323 } 00324 rtl_8139_tp.cur_rx = cur_rx; 00325 } |
|
Definition at line 329 of file rtl_rtl8139_drv.c. References buffer, rtl8139_private::cur_tx, len, ring_info::mapping, rtl8139_private::mmio_addr, NUM_TX_DESC, rtl8139_private::pci_dev, rtl_8139_tp, RTL_W32, rtl8139_private::tx_buf, rtl8139_private::tx_flag, rtl8139_private::tx_info, TxAddr0, and TxStatus0. Referenced by rt_rtl8139_write().
00330 { 00331 unsigned char *buff; 00332 void *ioaddr = rtl_8139_tp.mmio_addr; 00333 int entry, len = 0; 00334 00335 rt_rtl8139_writting = 1; 00336 00337 /* Calculate the next Tx descriptor entry. */ 00338 entry = rtl_8139_tp.cur_tx % NUM_TX_DESC; 00339 00340 buff = rtl_8139_tp.tx_buf[entry]; 00341 if(buff) { 00342 memcpy(buff, buffer, size); 00343 len = sizeof(buff); 00344 } 00345 00346 rtl_8139_tp.tx_info[entry].mapping = pci_map_single (rtl_8139_tp.pci_dev, rtl_8139_tp.tx_buf[entry], size, PCI_DMA_TODEVICE); 00347 00348 RTL_W32 (TxAddr0 + (entry * 4), rtl_8139_tp.tx_info[entry].mapping); 00349 00350 rtl_8139_tp.cur_tx++; 00351 00352 /* Note: the chip doesn't have auto-pad! */ 00353 00354 RTL_W32 (TxStatus0 + (entry * sizeof (u32)), 00355 rtl_8139_tp.tx_flag | (size >= ETH_ZLEN ? size : ETH_ZLEN)); 00356 00357 rt_rtl8139_writting = 0; 00358 return size; 00359 } |
|
|
|
Definition at line 217 of file rtl_rtl8139_drv.c. References ipaddr, rt_rtl8139_ip_addr, and rt_rtl8139_n_filters. Referenced by rt_rtl8139_ioctl().
00217 { 00218 if(rt_rtl8139_n_filters<=1){ 00219 rt_rtl8139_ip_addr[rt_rtl8139_n_filters][0]=ipaddr & 0x000000ff; rt_rtl8139_ip_addr[rt_rtl8139_n_filters][1]= (ipaddr >> 8) & 0x000000ff; 00220 rt_rtl8139_ip_addr[rt_rtl8139_n_filters][2]= (ipaddr >> 16) & 0x000000ff; rt_rtl8139_ip_addr[rt_rtl8139_n_filters][3]= (ipaddr >> 24) & 0x000000ff; 00221 rt_rtl8139_n_filters++; 00222 return 0; 00223 } 00224 00225 rtl_printf("You cannot set more than 2 IP filters !!"); 00226 return -1; 00227 } |
|
Definition at line 686 of file rtl_rtl8139_drv.c. References AcceptAllPhys, AcceptBroadcast, AcceptMyPhys, rtl8139_private::chipset, rtl8139_private::drv_flags, rtl8139_private::mmio_addr, rtl_8139_tp, RTL_R32, RTL_W32_F, and RxConfig. Referenced by rt_rtl8139_hw_start().
00687 { 00688 void *ioaddr = rtl_8139_tp.mmio_addr; 00689 int rx_mode; 00690 u32 tmp; 00691 00692 /* Note: do not reorder, GCC is clever about common statements. */ 00693 rx_mode = AcceptBroadcast | AcceptMyPhys | AcceptAllPhys; 00694 00695 /* We can safely update without stopping the chip. */ 00696 tmp = rtl8139_rx_config | rx_mode | 00697 (RTL_R32 (RxConfig) & rtl_chip_info[rtl_8139_tp.chipset].RxConfigMask); 00698 RTL_W32_F (RxConfig, tmp); 00699 00700 rtl_printf ("%s: rtl8139_set_rx_mode(%4.4x) done -- Rx config %8.8lx.\n", 00701 dev->name, rtl_8139_tp.drv_flags, RTL_R32 (RxConfig)); 00702 00703 } |
|
Definition at line 1090 of file rtl_rtl8139_drv.c. References rtl8139_private::cur_tx, rtl8139_private::dirty_tx, NULL, NUM_TX_DESC, rtl8139_private::pci_dev, rtl_8139_tp, rtl8139_private::stats, and rtl8139_private::tx_info. Referenced by rt_rtl8139_close().
01091 { 01092 int i; 01093 01094 rtl_8139_tp.cur_tx = 0; 01095 rtl_8139_tp.dirty_tx = 0; 01096 01097 /* Dump the unsent Tx packets. */ 01098 for (i = 0; i < NUM_TX_DESC; i++) { 01099 struct ring_info *rp = &rtl_8139_tp.tx_info[i]; 01100 if (rp->mapping != 0) { 01101 pci_unmap_single (rtl_8139_tp.pci_dev, rp->mapping, 01102 rp->skb->len, PCI_DMA_TODEVICE); 01103 rp->mapping = 0; 01104 } 01105 if (rp->skb) { 01106 dev_kfree_skb (rp->skb); 01107 rp->skb = NULL; 01108 rtl_8139_tp.stats.tx_dropped++; 01109 } 01110 } 01111 } |
|
Definition at line 362 of file rtl_rtl8139_drv.c. References rtl8139_private::cur_tx, rtl8139_private::dirty_tx, ring_info::mapping, rtl8139_private::mmio_addr, NULL, NUM_TX_DESC, rtl8139_private::pci_dev, rtl_8139_tp, RTL_R32, RTL_W32, ring_info::skb, rtl8139_private::stats, TX_DMA_BURST, rtl8139_private::tx_flag, rtl8139_private::tx_info, TxAborted, TxCarrierLost, TxClearAbt, TxConfig, TxDMAShift, TxOutOfWindow, TxStatOK, TxStatus0, and TxUnderrun. Referenced by rt_rtl8139_interrupt().
00363 { 00364 void *ioaddr = rtl_8139_tp.mmio_addr; 00365 unsigned long dirty_tx, tx_left; 00366 00367 00368 dirty_tx = rtl_8139_tp.dirty_tx; 00369 tx_left = rtl_8139_tp.cur_tx - dirty_tx; 00370 while (tx_left > 0) { 00371 int entry = dirty_tx % NUM_TX_DESC; 00372 int txstatus; 00373 00374 txstatus = RTL_R32 (TxStatus0 + (entry * sizeof (u32))); 00375 00376 if (!(txstatus & (TxStatOK | TxUnderrun | TxAborted))) 00377 break; /* It still hasn't been Txed */ 00378 /* Note: TxCarrierLost is always asserted at 100mbps. */ 00379 if (txstatus & (TxOutOfWindow | TxAborted)) { 00380 /* There was an major error, log it. */ 00381 rtl_printf ("Transmit error, Tx status %8.8x.\n", 00382 txstatus); 00383 rtl_8139_tp.stats.tx_errors++; 00384 if (txstatus & TxAborted) { 00385 rtl_8139_tp.stats.tx_aborted_errors++; 00386 RTL_W32 (TxConfig, TxClearAbt | (TX_DMA_BURST << TxDMAShift)); 00387 } 00388 if (txstatus & TxCarrierLost) 00389 rtl_8139_tp.stats.tx_carrier_errors++; 00390 if (txstatus & TxOutOfWindow) 00391 rtl_8139_tp.stats.tx_window_errors++; 00392 #ifdef ETHER_STATS 00393 if ((txstatus & 0x0f000000) == 0x0f000000) 00394 rtl_8139_tp.stats.collisions16++; 00395 #endif 00396 } else { 00397 if (txstatus & TxUnderrun) { 00398 /* Add 64 to the Tx FIFO threshold. */ 00399 if (rtl_8139_tp.tx_flag < 0x00300000) 00400 rtl_8139_tp.tx_flag += 0x00020000; 00401 rtl_8139_tp.stats.tx_fifo_errors++; 00402 } 00403 rtl_8139_tp.stats.collisions += (txstatus >> 24) & 15; 00404 rtl_8139_tp.stats.tx_bytes += txstatus & 0x7ff; 00405 rtl_8139_tp.stats.tx_packets++; 00406 } 00407 /* Free the original skb. */ 00408 if (rtl_8139_tp.tx_info[entry].mapping != 0) { 00409 pci_unmap_single(rtl_8139_tp.pci_dev, 00410 rtl_8139_tp.tx_info[entry].mapping, 00411 rtl_8139_tp.tx_info[entry].skb->len, 00412 PCI_DMA_TODEVICE); 00413 rtl_8139_tp.tx_info[entry].mapping = 0; 00414 } 00415 rtl_8139_tp.tx_info[entry].skb = NULL; 00416 00417 dirty_tx++; 00418 tx_left--; 00419 } 00420 00421 #ifdef RTL8139_DEBUG 00422 if (rtl_8139_tp.cur_tx - dirty_tx > NUM_TX_DESC) { 00423 printk (KERN_ERR "%s: Out-of-sync dirty pointer, %ld vs. %ld.\n", 00424 dev->name, dirty_tx, rtl_8139_tp.cur_tx); 00425 dirty_tx += NUM_TX_DESC; 00426 } 00427 #endif /* RTL8139_NDEBUG */ 00428 /* only wake the queue if we did work, and the queue is stopped */ 00429 if (rtl_8139_tp.dirty_tx != dirty_tx) { 00430 rtl_8139_tp.dirty_tx = dirty_tx; 00431 } 00432 00433 } |
|
Definition at line 1214 of file rtl_rtl8139_drv.c. References rt_rtl8139_send_packet().
01215 { 01216 01217 ssize_t tmp; 01218 rtl_irqstate_t state; 01219 01220 rtl_no_interrupts(state); 01221 tmp=rt_rtl8139_send_packet(buf,count); 01222 rtl_restore_interrupts(state); 01223 01224 return tmp; 01225 01226 } |
Here is the call graph for this function:
|
Definition at line 882 of file rtl_rtl8139_drv.c. References rtl8139_private::advertising, rtl8139_private::AutoNegoAbility, Cfg1_MMIO, Cfg1_PIO, Cfg9346, Cfg9346_Unlock, CH_8139B, ChipCmd, ChipCmdClear, rtl8139_private::chipset, CmdReset, Config1, Config1Clear, Config4, rtl8139_private::default_port, rtl8139_private::dev_addr, dev_rtl8139_open(), rtl8139_private::drv_flags, rtl8139_private::duplex_lock, rtl8139_private::full_duplex, HAS_MII_XCVR, HltClk, MAX_UNITS, rtl8139_private::medialock, rtl8139_private::mmio_addr, rtl8139_private::mmio_len, NULL, rtl8139_private::pci_dev, rtl8139_private::phys, rt_pci_resource_end, rt_pci_resource_flags, rt_pci_resource_len, rt_pci_resource_start, rt_rtl8139_mdio_read(), rt_rtl8139_mdio_write(), rt_rtl8139_read_eeprom(), RTL8139B_IO_SIZE, rtl_8139_tp, RTL_MIN_IO_SIZE, RTL_R32, RTL_R8, RTL_W8, RTL_W8_F, and TxConfig. Referenced by rt_rtl8139_open().
00882 { 00883 00884 u32 pio_start, pio_end, pio_flags, pio_len; 00885 unsigned long mmio_start, mmio_end, mmio_flags; 00886 unsigned int mmio_len; 00887 u8 tmp8; 00888 int rc=0, i, option, addr_len; 00889 static int board_idx=0; 00890 u32 tmp; 00891 void *ioaddr = NULL; 00892 char *print_name; 00893 00894 print_name = dev ? dev->slot_name : "rtl8139"; 00895 00896 pio_start = rt_pci_resource_start (dev, 0); 00897 pio_end = rt_pci_resource_end (dev, 0); 00898 pio_flags = rt_pci_resource_flags (dev, 0); 00899 pio_len = rt_pci_resource_len (dev, 0); 00900 00901 mmio_start = rt_pci_resource_start (dev, 1); 00902 mmio_end = rt_pci_resource_end (dev, 1); 00903 mmio_flags = rt_pci_resource_flags (dev, 1); 00904 mmio_len = rt_pci_resource_len (dev, 1); 00905 rtl_8139_tp.mmio_len = mmio_len; 00906 00907 /* set this immediately, we need to know before 00908 * we talk to the chip directly */ 00909 if (pio_len == RTL8139B_IO_SIZE) { 00910 rtl_8139_tp.chipset = CH_8139B; 00911 } 00912 00913 /* make sure PCI base addr 0 is PIO */ 00914 if (!(pio_flags & IORESOURCE_IO)) { 00915 rtl_printf ("region #0 not a PIO resource, aborting\n"); 00916 } 00917 00918 /* make sure PCI base addr 1 is MMIO */ 00919 if (!(mmio_flags & IORESOURCE_MEM)) { 00920 rtl_printf ( "region #1 not an MMIO resource, aborting\n"); 00921 } 00922 00923 /* check for weird/broken PCI region reporting */ 00924 if ((pio_len < RTL_MIN_IO_SIZE) || (mmio_len < RTL_MIN_IO_SIZE)) { 00925 rtl_printf ( "Invalid PCI region size(s), aborting\n"); 00926 } 00927 00928 00929 00930 00931 print_name = dev ? dev->slot_name : "rtl8139"; 00932 00933 rc = pci_request_regions (dev, dev->name); 00934 00935 00936 if (rc) 00937 goto err_out; 00938 00939 00940 pci_set_master (dev); 00941 00942 /* ioremap MMIO region */ 00943 ioaddr = ioremap (mmio_start, mmio_len); 00944 if (ioaddr == NULL) { 00945 rtl_printf ("cannot remap MMIO, aborting\n"); 00946 rc = -EIO; 00947 goto err_out; 00948 } 00949 00950 00951 00952 /* Soft reset the chip. */ 00953 RTL_W8 (ChipCmd, (RTL_R8 (ChipCmd) & ChipCmdClear) | CmdReset); 00954 00955 /* Check that the chip has finished the reset. */ 00956 for (i = 1000; i > 0; i--) 00957 if ((RTL_R8 (ChipCmd) & CmdReset) == 0) 00958 break; 00959 else 00960 udelay (10); 00961 00962 /* Bring the chip out of low-power mode. */ 00963 if (rtl_8139_tp.chipset == CH_8139B) { 00964 RTL_W8 (Config1, RTL_R8 (Config1) & ~(1<<4)); 00965 00966 RTL_W8 (Config4, RTL_R8 (Config4) & ~(1<<2)); 00967 } else { 00968 /* handle RTL8139A and RTL8139 cases */ 00969 /* XXX from becker driver. is this right?? */ 00970 RTL_W8 (Config1, 0); 00971 } 00972 00973 /* make sure chip thinks PIO and MMIO are enabled */ 00974 tmp8 = RTL_R8 (Config1); 00975 if ((tmp8 & Cfg1_PIO) == 0) { 00976 rtl_printf ("PIO not enabled, Cfg1=%02X, aborting\n", tmp8); 00977 rc = -EIO; 00978 goto err_out; 00979 } 00980 if ((tmp8 & Cfg1_MMIO) == 0) { 00981 rtl_printf ("MMIO not enabled, Cfg1=%02X, aborting\n", tmp8); 00982 rc = -EIO; 00983 goto err_out; 00984 } 00985 00986 /* identify chip attached to board */ 00987 /* tmp = RTL_R8 (ChipVersion); */ 00988 tmp = RTL_R32 (TxConfig); 00989 tmp = ( (tmp&0x7c000000) + ( (tmp&0x00800000)<<2 ) )>>24; 00990 00991 00992 00993 rtl_8139_tp.drv_flags = board_info[0].hw_flags; 00994 rtl_8139_tp.pci_dev = dev; 00995 rtl_8139_tp.mmio_addr = ioaddr; 00996 00997 for (i = ARRAY_SIZE (rtl_chip_info) - 1; i >= 0; i--) 00998 if (tmp == rtl_chip_info[i].version) { 00999 rtl_8139_tp.chipset = i; 01000 } 01001 if(rtl_8139_tp.chipset > (ARRAY_SIZE (rtl_chip_info) - 2)) 01002 rtl_8139_tp.chipset = ARRAY_SIZE (rtl_chip_info) - 2; 01003 01004 01005 /* Find the connected MII xcvrs. 01006 Doing this in open() would allow detecting external xcvrs later, but takes too much time. */ 01007 01008 if (rtl_8139_tp.drv_flags & HAS_MII_XCVR) { 01009 int phy, phy_idx = 0; 01010 for (phy = 0; phy < 32 && phy_idx < sizeof(rtl_8139_tp.phys); phy++) { 01011 int mii_status = rt_rtl8139_mdio_read(dev, phy, 1); 01012 if (mii_status != 0xffff && mii_status != 0x0000) { 01013 rtl_8139_tp.phys[phy_idx++] = phy; 01014 rtl_8139_tp.advertising = rt_rtl8139_mdio_read(dev, phy, 4); 01015 rtl_printf( "%s: MII transceiver %d status 0x%4.4x " 01016 "advertising %4.4x.\n", 01017 dev->name, phy, mii_status, rtl_8139_tp.advertising); 01018 } 01019 } 01020 if (phy_idx == 0) { 01021 rtl_printf( "%s: No MII transceivers found! Assuming SYM " 01022 "transceiver.\n", 01023 dev->name); 01024 rtl_8139_tp.phys[0] = 32; 01025 } 01026 } else 01027 rtl_8139_tp.phys[0] = 32; 01028 01029 /* Put the chip into low-power mode. */ 01030 RTL_W8_F (Cfg9346, Cfg9346_Unlock); 01031 01032 tmp = RTL_R8 (Config1) & Config1Clear; 01033 tmp |= (rtl_8139_tp.chipset == CH_8139B) ? 3 : 1; /* Enable PM/VPD */ 01034 RTL_W8_F (Config1, tmp); 01035 01036 RTL_W8_F (HltClk, 'H'); /* 'R' would leave the clock running. */ 01037 01038 /* The lower four bits are the media type. */ 01039 option = (board_idx >= MAX_UNITS) ? 0 : media[board_idx]; 01040 rtl_8139_tp.AutoNegoAbility = option&0xF; 01041 01042 if (option > 0) { 01043 rtl_8139_tp.full_duplex = (option & 0x210) ? 1 : 0; 01044 rtl_8139_tp.default_port = option & 0xFF; 01045 if (rtl_8139_tp.default_port) 01046 rtl_8139_tp.medialock = 1; 01047 } 01048 if (board_idx < MAX_UNITS && full_duplex[board_idx] > 0) 01049 rtl_8139_tp.full_duplex = full_duplex[board_idx]; 01050 if (rtl_8139_tp.full_duplex) { 01051 rtl_printf( "%s: Media type forced to Full Duplex.\n", dev->name); 01052 /* Changing the MII-advertised media because might prevent re-connection. */ 01053 rtl_8139_tp.duplex_lock = 1; 01054 } 01055 01056 if (rtl_8139_tp.default_port) { 01057 rtl_printf( "%s: Forcing %dMbs %s-duplex operation.\n", dev->name, 01058 (option & 0x0C ? 100 : 10), 01059 (option & 0x0A ? "full" : "half")); 01060 rt_rtl8139_mdio_write(dev, rtl_8139_tp.phys[0], 0, 01061 ((option & 0x20) ? 0x2000 : 0) | /* 100mbps? */ 01062 ((option & 0x10) ? 0x0100 : 0)); /* Full duplex? */ 01063 } 01064 01065 addr_len = rt_rtl8139_read_eeprom (ioaddr, 0, 8) == 0x8129 ? 8 : 6; 01066 for (i = 0; i < 3; i++) 01067 ((u16 *) (rtl_8139_tp.dev_addr))[i] = le16_to_cpu (rt_rtl8139_read_eeprom (ioaddr, i + 7, addr_len)); 01068 01069 rtl_printf( "%s: %s at 0x%lx, " 01070 "%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, " 01071 "IRQ %d\n", 01072 dev->name, 01073 board_info[0].name, 01074 rtl_8139_tp.mmio_addr, 01075 rtl_8139_tp.dev_addr[0], rtl_8139_tp.dev_addr[1], 01076 rtl_8139_tp.dev_addr[2], rtl_8139_tp.dev_addr[3], 01077 rtl_8139_tp.dev_addr[4], rtl_8139_tp.dev_addr[5], 01078 dev->irq); 01079 01080 dev_rtl8139_open(dev); 01081 01082 return 0; 01083 err_out: 01084 rtl_printf ("EXIT, returning %d\n", rc); 01085 return rc; 01086 } |
Here is the call graph for this function:
|
Definition at line 667 of file rtl_rtl8139_drv.c. Referenced by rt_rtl8139_ether_crc(). |
|
Initial value: { NULL, rt_rtl8139_read, rt_rtl8139_write, rt_rtl8139_ioctl, NULL, rt_rtl8139_open, rt_rtl8139_release } Definition at line 185 of file rtl_rtl8139_drv.c. Referenced by init_module(). |
|
Definition at line 195 of file rtl_rtl8139_drv.c. Referenced by cleanup_module(), and rt_rtl8139_interrupt(). |
|
Definition at line 196 of file rtl_rtl8139_drv.c. Referenced by rt_rtl8139_interrupt(). |
|
Definition at line 200 of file rtl_rtl8139_drv.c. Referenced by rt_rtl8139_rx_interrupt(), and rt_rtl8139_set_ip_filter(). |
|
Definition at line 199 of file rtl_rtl8139_drv.c. Referenced by rt_rtl8139_interrupt(). |
|
Definition at line 201 of file rtl_rtl8139_drv.c. Referenced by rt_rtl8139_rx_interrupt(), and rt_rtl8139_set_ip_filter(). |
|
Initial value: { FIFO_add_frame_to_buffer, FIFO_extract_frame_of_buffer, FIFO_initialize_rx_buffer, FIFO_dealloc_rx_buffer, } Definition at line 154 of file rtl_rtl8139_drv.c. Referenced by init_rtl8139_device(), rt_rtl8139_read(), rt_rtl8139_release(), and rt_rtl8139_rx_interrupt(). |
|
Definition at line 202 of file rtl_rtl8139_drv.c. Referenced by cleanup_module(), and init_module(). |
|
Definition at line 161 of file rtl_rtl8139_drv.c. Referenced by init_rtl8139_device(), rt_rtl8139_read(), rt_rtl8139_release(), and rt_rtl8139_rx_interrupt(). |
|
Definition at line 152 of file rtl_rtl8139_drv.c. Referenced by rt_rtl8139_open(), rt_rtl8139_read(), rt_rtl8139_release(), and rt_rtl8139_rx_interrupt(). |
|
Definition at line 203 of file rtl_rtl8139_drv.c. Referenced by rt_rtl8139_interrupt(), rt_rtl8139_open(), and rt_rtl8139_release(). |
|