Ignore:
File:
1 edited

Legend:

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

    r9f0fb84 rc4be33a  
    4444#include <libarch/ddi.h>
    4545#include <as.h>
    46 #include <ddf/log.h>
    4746#include <ddf/interrupt.h>
    4847#include <devman.h>
     
    112111/** E1000 device data */
    113112typedef struct {
    114         /** Device configuration */
    115         e1000_info_t info;
    116        
    117113        /** Physical registers base address */
    118114        void *reg_base_phys;
     
    147143        /** Used milticast Receive addrress count */
    148144        unsigned int multicast_ra_count;
     145       
     146        /** PCI device ID */
     147        uint16_t device_id;
    149148       
    150149        /** The irq assigned */
     
    18891888        /* Allocate driver data for the device. */
    18901889        e1000_t *e1000 = e1000_create_dev_data(dev);
    1891         if (e1000 == NULL) {
    1892                 ddf_msg(LVL_ERROR, "Unable to allocate device softstate");
     1890        if (e1000 == NULL)
    18931891                return ENOMEM;
    1894         }
    18951892       
    18961893        /* Obtain and fill hardware resources info */
    18971894        int rc = e1000_get_resource_info(dev);
    18981895        if (rc != EOK) {
    1899                 ddf_msg(LVL_ERROR, "Cannot obtain hardware resources");
    19001896                e1000_dev_cleanup(dev);
    19011897                return rc;
    19021898        }
    19031899       
    1904         uint16_t device_id;
    19051900        rc = pci_config_space_read_16(dev->parent_sess, PCI_DEVICE_ID,
    1906             &device_id);
     1901            &e1000->device_id);
    19071902        if (rc != EOK) {
    1908                 ddf_msg(LVL_ERROR, "Cannot access PCI configuration space");
    19091903                e1000_dev_cleanup(dev);
    19101904                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;
    19821905        }
    19831906       
     
    21002023        fibril_mutex_lock(&e1000->eeprom_lock);
    21012024       
     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       
    21022048        /* Write address and START bit to EERD register */
    2103         uint32_t write_data = e1000->info.eerd_start |
    2104             (((uint32_t) eeprom_address) <<
    2105             e1000->info.eerd_address_offset);
     2049        uint32_t write_data = EERD_START |
     2050            (((uint32_t) eeprom_address) << eerd_address_offset);
    21062051        E1000_REG_WRITE(e1000, E1000_EERD, write_data);
    21072052       
    21082053        uint32_t eerd = E1000_REG_READ(e1000, E1000_EERD);
    2109         while ((eerd & e1000->info.eerd_done) == 0) {
     2054        while ((eerd & eerd_done) == 0) {
    21102055                usleep(1);
    21112056                eerd = E1000_REG_READ(e1000, E1000_EERD);
     
    21142059        fibril_mutex_unlock(&e1000->eeprom_lock);
    21152060       
    2116         return (uint16_t) (eerd >> e1000->info.eerd_data_offset);
     2061        return (uint16_t) (eerd >> EERD_DATA_OFFSET);
    21172062}
    21182063
     
    22832228        nic_driver_implement(&e1000_driver_ops, &e1000_dev_ops,
    22842229            &e1000_nic_iface);
    2285        
    2286         ddf_log_init(NAME, LVL_ERROR);
    2287         ddf_msg(LVL_NOTE, "HelenOS E1000 driver started");
    22882230        return ddf_driver_main(&e1000_driver);
    22892231}
Note: See TracChangeset for help on using the changeset viewer.