Changeset 77c2b02 in mainline for uspace/drv/nic/e1k/e1k.c


Ignore:
Timestamp:
2012-01-05T15:48:08Z (12 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9f0fb84
Parents:
c520034
Message:

e1k: add better extension points

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/nic/e1k/e1k.c

    rc520034 r77c2b02  
    4444#include <libarch/ddi.h>
    4545#include <as.h>
     46#include <ddf/log.h>
    4647#include <ddf/interrupt.h>
    4748#include <devman.h>
     
    111112/** E1000 device data */
    112113typedef struct {
     114        /** Device configuration */
     115        e1000_info_t info;
     116       
    113117        /** Physical registers base address */
    114118        void *reg_base_phys;
     
    143147        /** Used milticast Receive addrress count */
    144148        unsigned int multicast_ra_count;
    145        
    146         /** PCI device ID */
    147         uint16_t device_id;
    148149       
    149150        /** The irq assigned */
     
    18881889        /* Allocate driver data for the device. */
    18891890        e1000_t *e1000 = e1000_create_dev_data(dev);
    1890         if (e1000 == NULL)
     1891        if (e1000 == NULL) {
     1892                ddf_msg(LVL_ERROR, "Unable to allocate device softstate");
    18911893                return ENOMEM;
     1894        }
    18921895       
    18931896        /* Obtain and fill hardware resources info */
    18941897        int rc = e1000_get_resource_info(dev);
    18951898        if (rc != EOK) {
     1899                ddf_msg(LVL_ERROR, "Cannot obtain hardware resources");
    18961900                e1000_dev_cleanup(dev);
    18971901                return rc;
    18981902        }
    18991903       
     1904        uint16_t device_id;
    19001905        rc = pci_config_space_read_16(dev->parent_sess, PCI_DEVICE_ID,
    1901             &e1000->device_id);
     1906            &device_id);
    19021907        if (rc != EOK) {
     1908                ddf_msg(LVL_ERROR, "Cannot access PCI configuration space");
    19031909                e1000_dev_cleanup(dev);
    19041910                return rc;
     1911        }
     1912       
     1913        e1000_board_t board;
     1914        switch (device_id) {
     1915        case 0x1013:
     1916        case 0x1018:
     1917        case 0x1078:
     1918                board = E1000_82541;
     1919                break;
     1920        case 0x1076:
     1921        case 0x1077:
     1922        case 0x107c:
     1923                board = E1000_82541REV2;
     1924                break;
     1925        case 0x1019:
     1926        case 0x101a:
     1927                board = E1000_82547;
     1928                break;
     1929        case 0x10b9:
     1930                board = E1000_82572;
     1931                break;
     1932        case 0x1096:
     1933                board = E1000_80003ES2;
     1934                break;
     1935        default:
     1936                ddf_msg(LVL_ERROR, "Device not supported (%#" PRIx16 ")",
     1937                    device_id);
     1938                e1000_dev_cleanup(dev);
     1939                return ENOTSUP;
     1940        }
     1941       
     1942        switch (board) {
     1943        case E1000_82541:
     1944        case E1000_82541REV2:
     1945        case E1000_82572:
     1946                e1000->info.eerd_start = 0x01;
     1947                e1000->info.eerd_done = 0x10;
     1948                e1000->info.eerd_address_offset = 8;
     1949                e1000->info.eerd_data_offset = 16;
     1950                break;
     1951        case E1000_82547:
     1952        case E1000_80003ES2:
     1953                e1000->info.eerd_start = 0x01;
     1954                e1000->info.eerd_done = 0x02;
     1955                e1000->info.eerd_address_offset = 2;
     1956                e1000->info.eerd_data_offset = 16;
     1957                break;
    19051958        }
    19061959       
     
    20232076        fibril_mutex_lock(&e1000->eeprom_lock);
    20242077       
    2025         uint32_t eerd_done;
    2026         uint32_t eerd_address_offset;
    2027        
    2028         switch (e1000->device_id) {
    2029         case 0x107c:
    2030         case 0x1013:
    2031         case 0x1018:
    2032         case 0x1019:
    2033         case 0x101A:
    2034         case 0x1076:
    2035         case 0x1077:
    2036         case 0x1078:
    2037         case 0x10b9:
    2038                 /* 82541xx and 82547GI/EI */
    2039                 eerd_done = EERD_DONE_82541XX_82547GI_EI;
    2040                 eerd_address_offset = EERD_ADDRESS_OFFSET_82541XX_82547GI_EI;
    2041                 break;
    2042         default:
    2043                 eerd_done = EERD_DONE;
    2044                 eerd_address_offset = EERD_ADDRESS_OFFSET;
    2045                 break;
    2046         }
    2047        
    20482078        /* Write address and START bit to EERD register */
    2049         uint32_t write_data = EERD_START |
    2050             (((uint32_t) eeprom_address) << eerd_address_offset);
     2079        uint32_t write_data = e1000->info.eerd_start |
     2080            (((uint32_t) eeprom_address) <<
     2081            e1000->info.eerd_address_offset);
    20512082        E1000_REG_WRITE(e1000, E1000_EERD, write_data);
    20522083       
    20532084        uint32_t eerd = E1000_REG_READ(e1000, E1000_EERD);
    2054         while ((eerd & eerd_done) == 0) {
     2085        while ((eerd & e1000->info.eerd_done) == 0) {
    20552086                usleep(1);
    20562087                eerd = E1000_REG_READ(e1000, E1000_EERD);
     
    20592090        fibril_mutex_unlock(&e1000->eeprom_lock);
    20602091       
    2061         return (uint16_t) (eerd >> EERD_DATA_OFFSET);
     2092        return (uint16_t) (eerd >> e1000->info.eerd_data_offset);
    20622093}
    20632094
     
    22282259        nic_driver_implement(&e1000_driver_ops, &e1000_dev_ops,
    22292260            &e1000_nic_iface);
     2261       
     2262        ddf_log_init(NAME, LVL_ERROR);
     2263        ddf_msg(LVL_NOTE, "HelenOS E1000 driver started");
    22302264        return ddf_driver_main(&e1000_driver);
    22312265}
Note: See TracChangeset for help on using the changeset viewer.