|
@@ -2138,6 +2138,119 @@ s32 e1000e_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * e1000_read_pba_string_generic - Read device part number
|
|
|
+ * @hw: pointer to the HW structure
|
|
|
+ * @pba_num: pointer to device part number
|
|
|
+ * @pba_num_size: size of part number buffer
|
|
|
+ *
|
|
|
+ * Reads the product board assembly (PBA) number from the EEPROM and stores
|
|
|
+ * the value in pba_num.
|
|
|
+ **/
|
|
|
+s32 e1000_read_pba_string_generic(struct e1000_hw *hw, u8 *pba_num,
|
|
|
+ u32 pba_num_size)
|
|
|
+{
|
|
|
+ s32 ret_val;
|
|
|
+ u16 nvm_data;
|
|
|
+ u16 pba_ptr;
|
|
|
+ u16 offset;
|
|
|
+ u16 length;
|
|
|
+
|
|
|
+ if (pba_num == NULL) {
|
|
|
+ e_dbg("PBA string buffer was null\n");
|
|
|
+ ret_val = E1000_ERR_INVALID_ARGUMENT;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret_val = e1000_read_nvm(hw, NVM_PBA_OFFSET_0, 1, &nvm_data);
|
|
|
+ if (ret_val) {
|
|
|
+ e_dbg("NVM Read Error\n");
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret_val = e1000_read_nvm(hw, NVM_PBA_OFFSET_1, 1, &pba_ptr);
|
|
|
+ if (ret_val) {
|
|
|
+ e_dbg("NVM Read Error\n");
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * if nvm_data is not ptr guard the PBA must be in legacy format which
|
|
|
+ * means pba_ptr is actually our second data word for the PBA number
|
|
|
+ * and we can decode it into an ascii string
|
|
|
+ */
|
|
|
+ if (nvm_data != NVM_PBA_PTR_GUARD) {
|
|
|
+ e_dbg("NVM PBA number is not stored as string\n");
|
|
|
+
|
|
|
+ /* we will need 11 characters to store the PBA */
|
|
|
+ if (pba_num_size < 11) {
|
|
|
+ e_dbg("PBA string buffer too small\n");
|
|
|
+ return E1000_ERR_NO_SPACE;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* extract hex string from data and pba_ptr */
|
|
|
+ pba_num[0] = (nvm_data >> 12) & 0xF;
|
|
|
+ pba_num[1] = (nvm_data >> 8) & 0xF;
|
|
|
+ pba_num[2] = (nvm_data >> 4) & 0xF;
|
|
|
+ pba_num[3] = nvm_data & 0xF;
|
|
|
+ pba_num[4] = (pba_ptr >> 12) & 0xF;
|
|
|
+ pba_num[5] = (pba_ptr >> 8) & 0xF;
|
|
|
+ pba_num[6] = '-';
|
|
|
+ pba_num[7] = 0;
|
|
|
+ pba_num[8] = (pba_ptr >> 4) & 0xF;
|
|
|
+ pba_num[9] = pba_ptr & 0xF;
|
|
|
+
|
|
|
+ /* put a null character on the end of our string */
|
|
|
+ pba_num[10] = '\0';
|
|
|
+
|
|
|
+ /* switch all the data but the '-' to hex char */
|
|
|
+ for (offset = 0; offset < 10; offset++) {
|
|
|
+ if (pba_num[offset] < 0xA)
|
|
|
+ pba_num[offset] += '0';
|
|
|
+ else if (pba_num[offset] < 0x10)
|
|
|
+ pba_num[offset] += 'A' - 0xA;
|
|
|
+ }
|
|
|
+
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret_val = e1000_read_nvm(hw, pba_ptr, 1, &length);
|
|
|
+ if (ret_val) {
|
|
|
+ e_dbg("NVM Read Error\n");
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (length == 0xFFFF || length == 0) {
|
|
|
+ e_dbg("NVM PBA number section invalid length\n");
|
|
|
+ ret_val = E1000_ERR_NVM_PBA_SECTION;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ /* check if pba_num buffer is big enough */
|
|
|
+ if (pba_num_size < (((u32)length * 2) - 1)) {
|
|
|
+ e_dbg("PBA string buffer too small\n");
|
|
|
+ ret_val = E1000_ERR_NO_SPACE;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* trim pba length from start of string */
|
|
|
+ pba_ptr++;
|
|
|
+ length--;
|
|
|
+
|
|
|
+ for (offset = 0; offset < length; offset++) {
|
|
|
+ ret_val = e1000_read_nvm(hw, pba_ptr + offset, 1, &nvm_data);
|
|
|
+ if (ret_val) {
|
|
|
+ e_dbg("NVM Read Error\n");
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ pba_num[offset * 2] = (u8)(nvm_data >> 8);
|
|
|
+ pba_num[(offset * 2) + 1] = (u8)(nvm_data & 0xFF);
|
|
|
+ }
|
|
|
+ pba_num[offset * 2] = '\0';
|
|
|
+
|
|
|
+out:
|
|
|
+ return ret_val;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* e1000_read_mac_addr_generic - Read device MAC address
|
|
|
* @hw: pointer to the HW structure
|
|
@@ -2579,25 +2692,3 @@ bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw)
|
|
|
out:
|
|
|
return ret_val;
|
|
|
}
|
|
|
-
|
|
|
-s32 e1000e_read_pba_num(struct e1000_hw *hw, u32 *pba_num)
|
|
|
-{
|
|
|
- s32 ret_val;
|
|
|
- u16 nvm_data;
|
|
|
-
|
|
|
- ret_val = e1000_read_nvm(hw, NVM_PBA_OFFSET_0, 1, &nvm_data);
|
|
|
- if (ret_val) {
|
|
|
- e_dbg("NVM Read Error\n");
|
|
|
- return ret_val;
|
|
|
- }
|
|
|
- *pba_num = (u32)(nvm_data << 16);
|
|
|
-
|
|
|
- ret_val = e1000_read_nvm(hw, NVM_PBA_OFFSET_1, 1, &nvm_data);
|
|
|
- if (ret_val) {
|
|
|
- e_dbg("NVM Read Error\n");
|
|
|
- return ret_val;
|
|
|
- }
|
|
|
- *pba_num |= nvm_data;
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|