Changeset 77c2b02 in mainline for uspace/drv/nic/e1k/e1k.c
- Timestamp:
- 2012-01-05T15:48:08Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9f0fb84
- Parents:
- c520034
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/nic/e1k/e1k.c
rc520034 r77c2b02 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 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; 1905 1958 } 1906 1959 … … 2023 2076 fibril_mutex_lock(&e1000->eeprom_lock); 2024 2077 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 2078 /* 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); 2051 2082 E1000_REG_WRITE(e1000, E1000_EERD, write_data); 2052 2083 2053 2084 uint32_t eerd = E1000_REG_READ(e1000, E1000_EERD); 2054 while ((eerd & e erd_done) == 0) {2085 while ((eerd & e1000->info.eerd_done) == 0) { 2055 2086 usleep(1); 2056 2087 eerd = E1000_REG_READ(e1000, E1000_EERD); … … 2059 2090 fibril_mutex_unlock(&e1000->eeprom_lock); 2060 2091 2061 return (uint16_t) (eerd >> EERD_DATA_OFFSET);2092 return (uint16_t) (eerd >> e1000->info.eerd_data_offset); 2062 2093 } 2063 2094 … … 2228 2259 nic_driver_implement(&e1000_driver_ops, &e1000_dev_ops, 2229 2260 &e1000_nic_iface); 2261 2262 ddf_log_init(NAME, LVL_ERROR); 2263 ddf_msg(LVL_NOTE, "HelenOS E1000 driver started"); 2230 2264 return ddf_driver_main(&e1000_driver); 2231 2265 }
Note:
See TracChangeset
for help on using the changeset viewer.