Changes in uspace/drv/nic/e1k/e1k.c [9f0fb84:c4be33a] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/nic/e1k/e1k.c
r9f0fb84 rc4be33a 44 44 #include <libarch/ddi.h> 45 45 #include <as.h> 46 #include <ddf/log.h>47 46 #include <ddf/interrupt.h> 48 47 #include <devman.h> … … 112 111 /** E1000 device data */ 113 112 typedef struct { 114 /** Device configuration */115 e1000_info_t info;116 117 113 /** Physical registers base address */ 118 114 void *reg_base_phys; … … 147 143 /** Used milticast Receive addrress count */ 148 144 unsigned int multicast_ra_count; 145 146 /** PCI device ID */ 147 uint16_t device_id; 149 148 150 149 /** The irq assigned */ … … 1889 1888 /* Allocate driver data for the device. */ 1890 1889 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) 1893 1891 return ENOMEM; 1894 }1895 1892 1896 1893 /* Obtain and fill hardware resources info */ 1897 1894 int rc = e1000_get_resource_info(dev); 1898 1895 if (rc != EOK) { 1899 ddf_msg(LVL_ERROR, "Cannot obtain hardware resources");1900 1896 e1000_dev_cleanup(dev); 1901 1897 return rc; 1902 1898 } 1903 1899 1904 uint16_t device_id;1905 1900 rc = pci_config_space_read_16(dev->parent_sess, PCI_DEVICE_ID, 1906 & device_id);1901 &e1000->device_id); 1907 1902 if (rc != EOK) { 1908 ddf_msg(LVL_ERROR, "Cannot access PCI configuration space");1909 1903 e1000_dev_cleanup(dev); 1910 1904 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;1982 1905 } 1983 1906 … … 2100 2023 fibril_mutex_lock(&e1000->eeprom_lock); 2101 2024 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 2102 2048 /* 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); 2106 2051 E1000_REG_WRITE(e1000, E1000_EERD, write_data); 2107 2052 2108 2053 uint32_t eerd = E1000_REG_READ(e1000, E1000_EERD); 2109 while ((eerd & e 1000->info.eerd_done) == 0) {2054 while ((eerd & eerd_done) == 0) { 2110 2055 usleep(1); 2111 2056 eerd = E1000_REG_READ(e1000, E1000_EERD); … … 2114 2059 fibril_mutex_unlock(&e1000->eeprom_lock); 2115 2060 2116 return (uint16_t) (eerd >> e1000->info.eerd_data_offset);2061 return (uint16_t) (eerd >> EERD_DATA_OFFSET); 2117 2062 } 2118 2063 … … 2283 2228 nic_driver_implement(&e1000_driver_ops, &e1000_dev_ops, 2284 2229 &e1000_nic_iface); 2285 2286 ddf_log_init(NAME, LVL_ERROR);2287 ddf_msg(LVL_NOTE, "HelenOS E1000 driver started");2288 2230 return ddf_driver_main(&e1000_driver); 2289 2231 }
Note:
See TracChangeset
for help on using the changeset viewer.