Ignore:
File:
1 edited

Legend:

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

    rc4be33a r9f0fb84  
    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 0x100e:
     1916        case 0x1015:
     1917        case 0x1016:
     1918        case 0x1017:
     1919                board = E1000_82540;
     1920                break;
     1921        case 0x1013:
     1922        case 0x1018:
     1923        case 0x1078:
     1924                board = E1000_82541;
     1925                break;
     1926        case 0x1076:
     1927        case 0x1077:
     1928        case 0x107c:
     1929                board = E1000_82541REV2;
     1930                break;
     1931        case 0x100f:
     1932        case 0x1011:
     1933        case 0x1026:
     1934        case 0x1027:
     1935        case 0x1028:
     1936                board = E1000_82545;
     1937                break;
     1938        case 0x1010:
     1939        case 0x1012:
     1940        case 0x101d:
     1941        case 0x1079:
     1942        case 0x107a:
     1943        case 0x107b:
     1944                board = E1000_82546;
     1945                break;
     1946        case 0x1019:
     1947        case 0x101a:
     1948                board = E1000_82547;
     1949                break;
     1950        case 0x10b9:
     1951                board = E1000_82572;
     1952                break;
     1953        case 0x1096:
     1954                board = E1000_80003ES2;
     1955                break;
     1956        default:
     1957                ddf_msg(LVL_ERROR, "Device not supported (%#" PRIx16 ")",
     1958                    device_id);
     1959                e1000_dev_cleanup(dev);
     1960                return ENOTSUP;
     1961        }
     1962       
     1963        switch (board) {
     1964        case E1000_82540:
     1965        case E1000_82541:
     1966        case E1000_82541REV2:
     1967        case E1000_82545:
     1968        case E1000_82546:
     1969        case E1000_82572:
     1970                e1000->info.eerd_start = 0x01;
     1971                e1000->info.eerd_done = 0x10;
     1972                e1000->info.eerd_address_offset = 8;
     1973                e1000->info.eerd_data_offset = 16;
     1974                break;
     1975        case E1000_82547:
     1976        case E1000_80003ES2:
     1977                e1000->info.eerd_start = 0x01;
     1978                e1000->info.eerd_done = 0x02;
     1979                e1000->info.eerd_address_offset = 2;
     1980                e1000->info.eerd_data_offset = 16;
     1981                break;
    19051982        }
    19061983       
     
    20232100        fibril_mutex_lock(&e1000->eeprom_lock);
    20242101       
    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        
    20482102        /* Write address and START bit to EERD register */
    2049         uint32_t write_data = EERD_START |
    2050             (((uint32_t) eeprom_address) << eerd_address_offset);
     2103        uint32_t write_data = e1000->info.eerd_start |
     2104            (((uint32_t) eeprom_address) <<
     2105            e1000->info.eerd_address_offset);
    20512106        E1000_REG_WRITE(e1000, E1000_EERD, write_data);
    20522107       
    20532108        uint32_t eerd = E1000_REG_READ(e1000, E1000_EERD);
    2054         while ((eerd & eerd_done) == 0) {
     2109        while ((eerd & e1000->info.eerd_done) == 0) {
    20552110                usleep(1);
    20562111                eerd = E1000_REG_READ(e1000, E1000_EERD);
     
    20592114        fibril_mutex_unlock(&e1000->eeprom_lock);
    20602115       
    2061         return (uint16_t) (eerd >> EERD_DATA_OFFSET);
     2116        return (uint16_t) (eerd >> e1000->info.eerd_data_offset);
    20622117}
    20632118
     
    22282283        nic_driver_implement(&e1000_driver_ops, &e1000_dev_ops,
    22292284            &e1000_nic_iface);
     2285       
     2286        ddf_log_init(NAME, LVL_ERROR);
     2287        ddf_msg(LVL_NOTE, "HelenOS E1000 driver started");
    22302288        return ddf_driver_main(&e1000_driver);
    22312289}
Note: See TracChangeset for help on using the changeset viewer.