1 /****************************************************************************** 2 3 Copyright (c) 2001-2012, Intel Corporation 4 All rights reserved. 5 6 Redistribution and use in source and binary forms, with or without 7 modification, are permitted provided that the following conditions are met: 8 9 1. Redistributions of source code must retain the above copyright notice, 10 this list of conditions and the following disclaimer. 11 12 2. Redistributions in binary form must reproduce the above copyright 13 notice, this list of conditions and the following disclaimer in the 14 documentation and/or other materials provided with the distribution. 15 16 3. Neither the name of the Intel Corporation nor the names of its 17 contributors may be used to endorse or promote products derived from 18 this software without specific prior written permission. 19 20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 24 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 POSSIBILITY OF SUCH DAMAGE. 31 32 ******************************************************************************/ 33 /*$FreeBSD$*/ 34 35 #include "e1000_api.h" 36 37 /** 38 * e1000_calculate_checksum - Calculate checksum for buffer 39 * @buffer: pointer to EEPROM 40 * @length: size of EEPROM to calculate a checksum for 41 * 42 * Calculates the checksum for some buffer on a specified length. The 43 * checksum calculated is returned. 44 **/ 45 u8 e1000_calculate_checksum(u8 *buffer, u32 length) 46 { 47 u32 i; 48 u8 sum = 0; 49 50 DEBUGFUNC("e1000_calculate_checksum"); 51 52 if (!buffer) 53 return 0; 54 55 for (i = 0; i < length; i++) 56 sum += buffer[i]; 57 58 return (u8) (0 - sum); 59 } 60 61 /** 62 * e1000_mng_enable_host_if_generic - Checks host interface is enabled 63 * @hw: pointer to the HW structure 64 * 65 * Returns E1000_success upon success, else E1000_ERR_HOST_INTERFACE_COMMAND 66 * 67 * This function checks whether the HOST IF is enabled for command operation 68 * and also checks whether the previous command is completed. It busy waits 69 * in case of previous command is not completed. 70 **/ 71 s32 e1000_mng_enable_host_if_generic(struct e1000_hw *hw) 72 { 73 u32 hicr; 74 u8 i; 75 76 DEBUGFUNC("e1000_mng_enable_host_if_generic"); 77 78 if (!hw->mac.arc_subsystem_valid) { 79 DEBUGOUT("ARC subsystem not valid.\n"); 80 return -E1000_ERR_HOST_INTERFACE_COMMAND; 81 } 82 83 /* Check that the host interface is enabled. */ 84 hicr = E1000_READ_REG(hw, E1000_HICR); 85 if (!(hicr & E1000_HICR_EN)) { 86 DEBUGOUT("E1000_HOST_EN bit disabled.\n"); 87 return -E1000_ERR_HOST_INTERFACE_COMMAND; 88 } 89 /* check the previous command is completed */ 90 for (i = 0; i < E1000_MNG_DHCP_COMMAND_TIMEOUT; i++) { 91 hicr = E1000_READ_REG(hw, E1000_HICR); 92 if (!(hicr & E1000_HICR_C)) 93 break; 94 msec_delay_irq(1); 95 } 96 97 if (i == E1000_MNG_DHCP_COMMAND_TIMEOUT) { 98 DEBUGOUT("Previous command timeout failed .\n"); 99 return -E1000_ERR_HOST_INTERFACE_COMMAND; 100 } 101 102 return E1000_SUCCESS; 103 } 104 105 /** 106 * e1000_check_mng_mode_generic - Generic check management mode 107 * @hw: pointer to the HW structure 108 * 109 * Reads the firmware semaphore register and returns TRUE (>0) if 110 * manageability is enabled, else FALSE (0). 111 **/ 112 bool e1000_check_mng_mode_generic(struct e1000_hw *hw) 113 { 114 u32 fwsm = E1000_READ_REG(hw, E1000_FWSM); 115 116 DEBUGFUNC("e1000_check_mng_mode_generic"); 117 118 119 return (fwsm & E1000_FWSM_MODE_MASK) == 120 (E1000_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT); 121 } 122 123 /** 124 * e1000_enable_tx_pkt_filtering_generic - Enable packet filtering on Tx 125 * @hw: pointer to the HW structure 126 * 127 * Enables packet filtering on transmit packets if manageability is enabled 128 * and host interface is enabled. 129 **/ 130 bool e1000_enable_tx_pkt_filtering_generic(struct e1000_hw *hw) 131 { 132 struct e1000_host_mng_dhcp_cookie *hdr = &hw->mng_cookie; 133 u32 *buffer = (u32 *)&hw->mng_cookie; 134 u32 offset; 135 s32 ret_val, hdr_csum, csum; 136 u8 i, len; 137 138 DEBUGFUNC("e1000_enable_tx_pkt_filtering_generic"); 139 140 hw->mac.tx_pkt_filtering = TRUE; 141 142 /* No manageability, no filtering */ 143 if (!hw->mac.ops.check_mng_mode(hw)) { 144 hw->mac.tx_pkt_filtering = FALSE; 145 return hw->mac.tx_pkt_filtering; 146 } 147 148 /* 149 * If we can't read from the host interface for whatever 150 * reason, disable filtering. 151 */ 152 ret_val = hw->mac.ops.mng_enable_host_if(hw); 153 if (ret_val != E1000_SUCCESS) { 154 hw->mac.tx_pkt_filtering = FALSE; 155 return hw->mac.tx_pkt_filtering; 156 } 157 158 /* Read in the header. Length and offset are in dwords. */ 159 len = E1000_MNG_DHCP_COOKIE_LENGTH >> 2; 160 offset = E1000_MNG_DHCP_COOKIE_OFFSET >> 2; 161 for (i = 0; i < len; i++) 162 *(buffer + i) = E1000_READ_REG_ARRAY_DWORD(hw, E1000_HOST_IF, 163 offset + i); 164 hdr_csum = hdr->checksum; 165 hdr->checksum = 0; 166 csum = e1000_calculate_checksum((u8 *)hdr, 167 E1000_MNG_DHCP_COOKIE_LENGTH); 168 /* 169 * If either the checksums or signature don't match, then 170 * the cookie area isn't considered valid, in which case we 171 * take the safe route of assuming Tx filtering is enabled. 172 */ 173 if ((hdr_csum != csum) || (hdr->signature != E1000_IAMT_SIGNATURE)) { 174 hw->mac.tx_pkt_filtering = TRUE; 175 return hw->mac.tx_pkt_filtering; 176 } 177 178 /* Cookie area is valid, make the final check for filtering. */ 179 if (!(hdr->status & E1000_MNG_DHCP_COOKIE_STATUS_PARSING)) 180 hw->mac.tx_pkt_filtering = FALSE; 181 182 return hw->mac.tx_pkt_filtering; 183 } 184 185 /** 186 * e1000_mng_write_cmd_header_generic - Writes manageability command header 187 * @hw: pointer to the HW structure 188 * @hdr: pointer to the host interface command header 189 * 190 * Writes the command header after does the checksum calculation. 191 **/ 192 s32 e1000_mng_write_cmd_header_generic(struct e1000_hw *hw, 193 struct e1000_host_mng_command_header *hdr) 194 { 195 u16 i, length = sizeof(struct e1000_host_mng_command_header); 196 197 DEBUGFUNC("e1000_mng_write_cmd_header_generic"); 198 199 /* Write the whole command header structure with new checksum. */ 200 201 hdr->checksum = e1000_calculate_checksum((u8 *)hdr, length); 202 203 length >>= 2; 204 /* Write the relevant command block into the ram area. */ 205 for (i = 0; i < length; i++) { 206 E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, i, 207 *((u32 *) hdr + i)); 208 E1000_WRITE_FLUSH(hw); 209 } 210 211 return E1000_SUCCESS; 212 } 213 214 /** 215 * e1000_mng_host_if_write_generic - Write to the manageability host interface 216 * @hw: pointer to the HW structure 217 * @buffer: pointer to the host interface buffer 218 * @length: size of the buffer 219 * @offset: location in the buffer to write to 220 * @sum: sum of the data (not checksum) 221 * 222 * This function writes the buffer content at the offset given on the host if. 223 * It also does alignment considerations to do the writes in most efficient 224 * way. Also fills up the sum of the buffer in *buffer parameter. 225 **/ 226 s32 e1000_mng_host_if_write_generic(struct e1000_hw *hw, u8 *buffer, 227 u16 length, u16 offset, u8 *sum) 228 { 229 u8 *tmp; 230 u8 *bufptr = buffer; 231 u32 data = 0; 232 u16 remaining, i, j, prev_bytes; 233 234 DEBUGFUNC("e1000_mng_host_if_write_generic"); 235 236 /* sum = only sum of the data and it is not checksum */ 237 238 if (length == 0 || offset + length > E1000_HI_MAX_MNG_DATA_LENGTH) 239 return -E1000_ERR_PARAM; 240 241 tmp = (u8 *)&data; 242 prev_bytes = offset & 0x3; 243 offset >>= 2; 244 245 if (prev_bytes) { 246 data = E1000_READ_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset); 247 for (j = prev_bytes; j < sizeof(u32); j++) { 248 *(tmp + j) = *bufptr++; 249 *sum += *(tmp + j); 250 } 251 E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset, data); 252 length -= j - prev_bytes; 253 offset++; 254 } 255 256 remaining = length & 0x3; 257 length -= remaining; 258 259 /* Calculate length in DWORDs */ 260 length >>= 2; 261 262 /* 263 * The device driver writes the relevant command block into the 264 * ram area. 265 */ 266 for (i = 0; i < length; i++) { 267 for (j = 0; j < sizeof(u32); j++) { 268 *(tmp + j) = *bufptr++; 269 *sum += *(tmp + j); 270 } 271 272 E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset + i, 273 data); 274 } 275 if (remaining) { 276 for (j = 0; j < sizeof(u32); j++) { 277 if (j < remaining) 278 *(tmp + j) = *bufptr++; 279 else 280 *(tmp + j) = 0; 281 282 *sum += *(tmp + j); 283 } 284 E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, offset + i, 285 data); 286 } 287 288 return E1000_SUCCESS; 289 } 290 291 /** 292 * e1000_mng_write_dhcp_info_generic - Writes DHCP info to host interface 293 * @hw: pointer to the HW structure 294 * @buffer: pointer to the host interface 295 * @length: size of the buffer 296 * 297 * Writes the DHCP information to the host interface. 298 **/ 299 s32 e1000_mng_write_dhcp_info_generic(struct e1000_hw *hw, u8 *buffer, 300 u16 length) 301 { 302 struct e1000_host_mng_command_header hdr; 303 s32 ret_val; 304 u32 hicr; 305 306 DEBUGFUNC("e1000_mng_write_dhcp_info_generic"); 307 308 hdr.command_id = E1000_MNG_DHCP_TX_PAYLOAD_CMD; 309 hdr.command_length = length; 310 hdr.reserved1 = 0; 311 hdr.reserved2 = 0; 312 hdr.checksum = 0; 313 314 /* Enable the host interface */ 315 ret_val = hw->mac.ops.mng_enable_host_if(hw); 316 if (ret_val) 317 return ret_val; 318 319 /* Populate the host interface with the contents of "buffer". */ 320 ret_val = hw->mac.ops.mng_host_if_write(hw, buffer, length, 321 sizeof(hdr), &(hdr.checksum)); 322 if (ret_val) 323 return ret_val; 324 325 /* Write the manageability command header */ 326 ret_val = hw->mac.ops.mng_write_cmd_header(hw, &hdr); 327 if (ret_val) 328 return ret_val; 329 330 /* Tell the ARC a new command is pending. */ 331 hicr = E1000_READ_REG(hw, E1000_HICR); 332 E1000_WRITE_REG(hw, E1000_HICR, hicr | E1000_HICR_C); 333 334 return E1000_SUCCESS; 335 } 336 337 /** 338 * e1000_enable_mng_pass_thru - Check if management passthrough is needed 339 * @hw: pointer to the HW structure 340 * 341 * Verifies the hardware needs to leave interface enabled so that frames can 342 * be directed to and from the management interface. 343 **/ 344 bool e1000_enable_mng_pass_thru(struct e1000_hw *hw) 345 { 346 u32 manc; 347 u32 fwsm, factps; 348 349 DEBUGFUNC("e1000_enable_mng_pass_thru"); 350 351 if (!hw->mac.asf_firmware_present) 352 return FALSE; 353 354 manc = E1000_READ_REG(hw, E1000_MANC); 355 356 if (!(manc & E1000_MANC_RCV_TCO_EN)) 357 return FALSE; 358 359 if (hw->mac.has_fwsm) { 360 fwsm = E1000_READ_REG(hw, E1000_FWSM); 361 factps = E1000_READ_REG(hw, E1000_FACTPS); 362 363 if (!(factps & E1000_FACTPS_MNGCG) && 364 ((fwsm & E1000_FWSM_MODE_MASK) == 365 (e1000_mng_mode_pt << E1000_FWSM_MODE_SHIFT))) 366 return TRUE; 367 } else if ((hw->mac.type == e1000_82574) || 368 (hw->mac.type == e1000_82583)) { 369 u16 data; 370 371 factps = E1000_READ_REG(hw, E1000_FACTPS); 372 e1000_read_nvm(hw, NVM_INIT_CONTROL2_REG, 1, &data); 373 374 if (!(factps & E1000_FACTPS_MNGCG) && 375 ((data & E1000_NVM_INIT_CTRL2_MNGM) == 376 (e1000_mng_mode_pt << 13))) 377 return TRUE; 378 } else if ((manc & E1000_MANC_SMBUS_EN) && 379 !(manc & E1000_MANC_ASF_EN)) { 380 return TRUE; 381 } 382 383 return FALSE; 384 } 385 386 /** 387 * e1000_host_interface_command - Writes buffer to host interface 388 * @hw: pointer to the HW structure 389 * @buffer: contains a command to write 390 * @length: the byte length of the buffer, must be multiple of 4 bytes 391 * 392 * Writes a buffer to the Host Interface. Upon success, returns E1000_SUCCESS 393 * else returns E1000_ERR_HOST_INTERFACE_COMMAND. 394 **/ 395 s32 e1000_host_interface_command(struct e1000_hw *hw, u8 *buffer, u32 length) 396 { 397 u32 hicr, i; 398 399 DEBUGFUNC("e1000_host_interface_command"); 400 401 if (!(hw->mac.arc_subsystem_valid)) { 402 DEBUGOUT("Hardware doesn't support host interface command.\n"); 403 return E1000_SUCCESS; 404 } 405 406 if (!hw->mac.asf_firmware_present) { 407 DEBUGOUT("Firmware is not present.\n"); 408 return E1000_SUCCESS; 409 } 410 411 if (length == 0 || length & 0x3 || 412 length > E1000_HI_MAX_BLOCK_BYTE_LENGTH) { 413 DEBUGOUT("Buffer length failure.\n"); 414 return -E1000_ERR_HOST_INTERFACE_COMMAND; 415 } 416 417 /* Check that the host interface is enabled. */ 418 hicr = E1000_READ_REG(hw, E1000_HICR); 419 if (!(hicr & E1000_HICR_EN)) { 420 DEBUGOUT("E1000_HOST_EN bit disabled.\n"); 421 return -E1000_ERR_HOST_INTERFACE_COMMAND; 422 } 423 424 /* Calculate length in DWORDs */ 425 length >>= 2; 426 427 /* 428 * The device driver writes the relevant command block 429 * into the ram area. 430 */ 431 for (i = 0; i < length; i++) 432 E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, i, 433 *((u32 *)buffer + i)); 434 435 /* Setting this bit tells the ARC that a new command is pending. */ 436 E1000_WRITE_REG(hw, E1000_HICR, hicr | E1000_HICR_C); 437 438 for (i = 0; i < E1000_HI_COMMAND_TIMEOUT; i++) { 439 hicr = E1000_READ_REG(hw, E1000_HICR); 440 if (!(hicr & E1000_HICR_C)) 441 break; 442 msec_delay(1); 443 } 444 445 /* Check command successful completion. */ 446 if (i == E1000_HI_COMMAND_TIMEOUT || 447 (!(E1000_READ_REG(hw, E1000_HICR) & E1000_HICR_SV))) { 448 DEBUGOUT("Command has failed with no status valid.\n"); 449 return -E1000_ERR_HOST_INTERFACE_COMMAND; 450 } 451 452 for (i = 0; i < length; i++) 453 *((u32 *)buffer + i) = E1000_READ_REG_ARRAY_DWORD(hw, 454 E1000_HOST_IF, 455 i); 456 457 return E1000_SUCCESS; 458 } 459 /** 460 * e1000_load_firmware - Writes proxy FW code buffer to host interface 461 * and execute. 462 * @hw: pointer to the HW structure 463 * @buffer: contains a firmware to write 464 * @length: the byte length of the buffer, must be multiple of 4 bytes 465 * 466 * Upon success returns E1000_SUCCESS, returns E1000_ERR_CONFIG if not enabled 467 * in HW else returns E1000_ERR_HOST_INTERFACE_COMMAND. 468 **/ 469 s32 e1000_load_firmware(struct e1000_hw *hw, u8 *buffer, u32 length) 470 { 471 u32 hicr, hibba, fwsm, icr, i; 472 473 DEBUGFUNC("e1000_load_firmware"); 474 475 if (hw->mac.type < e1000_i210) { 476 DEBUGOUT("Hardware doesn't support loading FW by the driver\n"); 477 return -E1000_ERR_CONFIG; 478 } 479 480 /* Check that the host interface is enabled. */ 481 hicr = E1000_READ_REG(hw, E1000_HICR); 482 if (!(hicr & E1000_HICR_EN)) { 483 DEBUGOUT("E1000_HOST_EN bit disabled.\n"); 484 return -E1000_ERR_CONFIG; 485 } 486 if (!(hicr & E1000_HICR_MEMORY_BASE_EN)) { 487 DEBUGOUT("E1000_HICR_MEMORY_BASE_EN bit disabled.\n"); 488 return -E1000_ERR_CONFIG; 489 } 490 491 if (length == 0 || length & 0x3 || length > E1000_HI_FW_MAX_LENGTH) { 492 DEBUGOUT("Buffer length failure.\n"); 493 return -E1000_ERR_INVALID_ARGUMENT; 494 } 495 496 /* Clear notification from ROM-FW by reading ICR register */ 497 icr = E1000_READ_REG(hw, E1000_ICR_V2); 498 499 /* Reset ROM-FW */ 500 hicr = E1000_READ_REG(hw, E1000_HICR); 501 hicr |= E1000_HICR_FW_RESET_ENABLE; 502 E1000_WRITE_REG(hw, E1000_HICR, hicr); 503 hicr |= E1000_HICR_FW_RESET; 504 E1000_WRITE_REG(hw, E1000_HICR, hicr); 505 E1000_WRITE_FLUSH(hw); 506 507 /* Wait till MAC notifies about its readiness after ROM-FW reset */ 508 for (i = 0; i < (E1000_HI_COMMAND_TIMEOUT * 2); i++) { 509 icr = E1000_READ_REG(hw, E1000_ICR_V2); 510 if (icr & E1000_ICR_MNG) 511 break; 512 msec_delay(1); 513 } 514 515 /* Check for timeout */ 516 if (i == E1000_HI_COMMAND_TIMEOUT) { 517 DEBUGOUT("FW reset failed.\n"); 518 return -E1000_ERR_HOST_INTERFACE_COMMAND; 519 } 520 521 /* Wait till MAC is ready to accept new FW code */ 522 for (i = 0; i < E1000_HI_COMMAND_TIMEOUT; i++) { 523 fwsm = E1000_READ_REG(hw, E1000_FWSM); 524 if ((fwsm & E1000_FWSM_FW_VALID) && 525 ((fwsm & E1000_FWSM_MODE_MASK) >> E1000_FWSM_MODE_SHIFT == 526 E1000_FWSM_HI_EN_ONLY_MODE)) 527 break; 528 msec_delay(1); 529 } 530 531 /* Check for timeout */ 532 if (i == E1000_HI_COMMAND_TIMEOUT) { 533 DEBUGOUT("FW reset failed.\n"); 534 return -E1000_ERR_HOST_INTERFACE_COMMAND; 535 } 536 537 /* Calculate length in DWORDs */ 538 length >>= 2; 539 540 /* 541 * The device driver writes the relevant FW code block 542 * into the ram area in DWORDs via 1kB ram addressing window. 543 */ 544 for (i = 0; i < length; i++) { 545 if (!(i % E1000_HI_FW_BLOCK_DWORD_LENGTH)) { 546 /* Point to correct 1kB ram window */ 547 hibba = E1000_HI_FW_BASE_ADDRESS + 548 ((E1000_HI_FW_BLOCK_DWORD_LENGTH << 2) * 549 (i / E1000_HI_FW_BLOCK_DWORD_LENGTH)); 550 551 E1000_WRITE_REG(hw, E1000_HIBBA, hibba); 552 } 553 554 E1000_WRITE_REG_ARRAY_DWORD(hw, E1000_HOST_IF, 555 i % E1000_HI_FW_BLOCK_DWORD_LENGTH, 556 *((u32 *)buffer + i)); 557 } 558 559 /* Setting this bit tells the ARC that a new FW is ready to execute. */ 560 hicr = E1000_READ_REG(hw, E1000_HICR); 561 E1000_WRITE_REG(hw, E1000_HICR, hicr | E1000_HICR_C); 562 563 for (i = 0; i < E1000_HI_COMMAND_TIMEOUT; i++) { 564 hicr = E1000_READ_REG(hw, E1000_HICR); 565 if (!(hicr & E1000_HICR_C)) 566 break; 567 msec_delay(1); 568 } 569 570 /* Check for successful FW start. */ 571 if (i == E1000_HI_COMMAND_TIMEOUT) { 572 DEBUGOUT("New FW did not start within timeout period.\n"); 573 return -E1000_ERR_HOST_INTERFACE_COMMAND; 574 } 575 576 return E1000_SUCCESS; 577 } 578 579 580