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