Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / net / ethernet / intel / ixgbe / ixgbe_x550.c
1 /*******************************************************************************
2  *
3  *  Intel 10 Gigabit PCI Express Linux driver
4  *  Copyright(c) 1999 - 2014 Intel Corporation.
5  *
6  *  This program is free software; you can redistribute it and/or modify it
7  *  under the terms and conditions of the GNU General Public License,
8  *  version 2, as published by the Free Software Foundation.
9  *
10  *  This program is distributed in the hope it will be useful, but WITHOUT
11  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  *  more details.
14  *
15  *  The full GNU General Public License is included in this distribution in
16  *  the file called "COPYING".
17  *
18  *  Contact Information:
19  *  Linux NICS <linux.nics@intel.com>
20  *  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
21  *  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
22  *
23  ******************************************************************************/
24 #include "ixgbe_x540.h"
25 #include "ixgbe_type.h"
26 #include "ixgbe_common.h"
27 #include "ixgbe_phy.h"
28
29 /** ixgbe_identify_phy_x550em - Get PHY type based on device id
30  *  @hw: pointer to hardware structure
31  *
32  *  Returns error code
33  */
34 static s32 ixgbe_identify_phy_x550em(struct ixgbe_hw *hw)
35 {
36         u32 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
37
38         switch (hw->device_id) {
39         case IXGBE_DEV_ID_X550EM_X_SFP:
40                 /* set up for CS4227 usage */
41                 hw->phy.phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM;
42                 if (hw->bus.lan_id) {
43                         esdp &= ~(IXGBE_ESDP_SDP1_NATIVE | IXGBE_ESDP_SDP1);
44                         esdp |= IXGBE_ESDP_SDP1_DIR;
45                 }
46                 esdp &= ~(IXGBE_ESDP_SDP0_NATIVE | IXGBE_ESDP_SDP0_DIR);
47                 IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
48
49                 return ixgbe_identify_module_generic(hw);
50         case IXGBE_DEV_ID_X550EM_X_KX4:
51                 hw->phy.type = ixgbe_phy_x550em_kx4;
52                 break;
53         case IXGBE_DEV_ID_X550EM_X_KR:
54                 hw->phy.type = ixgbe_phy_x550em_kr;
55                 break;
56         case IXGBE_DEV_ID_X550EM_X_1G_T:
57         case IXGBE_DEV_ID_X550EM_X_10G_T:
58                 return ixgbe_identify_phy_generic(hw);
59         default:
60                 break;
61         }
62         return 0;
63 }
64
65 static s32 ixgbe_read_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr,
66                                      u32 device_type, u16 *phy_data)
67 {
68         return IXGBE_NOT_IMPLEMENTED;
69 }
70
71 static s32 ixgbe_write_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr,
72                                       u32 device_type, u16 phy_data)
73 {
74         return IXGBE_NOT_IMPLEMENTED;
75 }
76
77 /** ixgbe_init_eeprom_params_X550 - Initialize EEPROM params
78  *  @hw: pointer to hardware structure
79  *
80  *  Initializes the EEPROM parameters ixgbe_eeprom_info within the
81  *  ixgbe_hw struct in order to set up EEPROM access.
82  **/
83 static s32 ixgbe_init_eeprom_params_X550(struct ixgbe_hw *hw)
84 {
85         struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
86         u32 eec;
87         u16 eeprom_size;
88
89         if (eeprom->type == ixgbe_eeprom_uninitialized) {
90                 eeprom->semaphore_delay = 10;
91                 eeprom->type = ixgbe_flash;
92
93                 eec = IXGBE_READ_REG(hw, IXGBE_EEC);
94                 eeprom_size = (u16)((eec & IXGBE_EEC_SIZE) >>
95                                     IXGBE_EEC_SIZE_SHIFT);
96                 eeprom->word_size = 1 << (eeprom_size +
97                                           IXGBE_EEPROM_WORD_SIZE_SHIFT);
98
99                 hw_dbg(hw, "Eeprom params: type = %d, size = %d\n",
100                        eeprom->type, eeprom->word_size);
101         }
102
103         return 0;
104 }
105
106 /** ixgbe_read_iosf_sb_reg_x550 - Writes a value to specified register of the
107  *  IOSF device
108  *  @hw: pointer to hardware structure
109  *  @reg_addr: 32 bit PHY register to write
110  *  @device_type: 3 bit device type
111  *  @phy_data: Pointer to read data from the register
112  **/
113 static s32 ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
114                                        u32 device_type, u32 *data)
115 {
116         u32 i, command, error;
117
118         command = ((reg_addr << IXGBE_SB_IOSF_CTRL_ADDR_SHIFT) |
119                    (device_type << IXGBE_SB_IOSF_CTRL_TARGET_SELECT_SHIFT));
120
121         /* Write IOSF control register */
122         IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL, command);
123
124         /* Check every 10 usec to see if the address cycle completed.
125          * The SB IOSF BUSY bit will clear when the operation is
126          * complete
127          */
128         for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
129                 usleep_range(10, 20);
130
131                 command = IXGBE_READ_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL);
132                 if ((command & IXGBE_SB_IOSF_CTRL_BUSY) == 0)
133                         break;
134         }
135
136         if ((command & IXGBE_SB_IOSF_CTRL_RESP_STAT_MASK) != 0) {
137                 error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
138                          IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
139                 hw_dbg(hw, "Failed to read, error %x\n", error);
140                 return IXGBE_ERR_PHY;
141         }
142
143         if (i == IXGBE_MDIO_COMMAND_TIMEOUT) {
144                 hw_dbg(hw, "Read timed out\n");
145                 return IXGBE_ERR_PHY;
146         }
147
148         *data = IXGBE_READ_REG(hw, IXGBE_SB_IOSF_INDIRECT_DATA);
149
150         return 0;
151 }
152
153 /** ixgbe_read_ee_hostif_data_X550 - Read EEPROM word using a host interface
154  *  command assuming that the semaphore is already obtained.
155  *  @hw: pointer to hardware structure
156  *  @offset: offset of  word in the EEPROM to read
157  *  @data: word read from the EEPROM
158  *
159  *  Reads a 16 bit word from the EEPROM using the hostif.
160  **/
161 static s32 ixgbe_read_ee_hostif_data_X550(struct ixgbe_hw *hw, u16 offset,
162                                           u16 *data)
163 {
164         s32 status;
165         struct ixgbe_hic_read_shadow_ram buffer;
166
167         buffer.hdr.req.cmd = FW_READ_SHADOW_RAM_CMD;
168         buffer.hdr.req.buf_lenh = 0;
169         buffer.hdr.req.buf_lenl = FW_READ_SHADOW_RAM_LEN;
170         buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
171
172         /* convert offset from words to bytes */
173         buffer.address = cpu_to_be32(offset * 2);
174         /* one word */
175         buffer.length = cpu_to_be16(sizeof(u16));
176
177         status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
178                                               sizeof(buffer),
179                                               IXGBE_HI_COMMAND_TIMEOUT, false);
180         if (status)
181                 return status;
182
183         *data = (u16)IXGBE_READ_REG_ARRAY(hw, IXGBE_FLEX_MNG,
184                                           FW_NVM_DATA_OFFSET);
185
186         return 0;
187 }
188
189 /** ixgbe_read_ee_hostif_buffer_X550- Read EEPROM word(s) using hostif
190  *  @hw: pointer to hardware structure
191  *  @offset: offset of  word in the EEPROM to read
192  *  @words: number of words
193  *  @data: word(s) read from the EEPROM
194  *
195  *  Reads a 16 bit word(s) from the EEPROM using the hostif.
196  **/
197 static s32 ixgbe_read_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
198                                             u16 offset, u16 words, u16 *data)
199 {
200         struct ixgbe_hic_read_shadow_ram buffer;
201         u32 current_word = 0;
202         u16 words_to_read;
203         s32 status;
204         u32 i;
205
206         /* Take semaphore for the entire operation. */
207         status = hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
208         if (status) {
209                 hw_dbg(hw, "EEPROM read buffer - semaphore failed\n");
210                 return status;
211         }
212
213         while (words) {
214                 if (words > FW_MAX_READ_BUFFER_SIZE / 2)
215                         words_to_read = FW_MAX_READ_BUFFER_SIZE / 2;
216                 else
217                         words_to_read = words;
218
219                 buffer.hdr.req.cmd = FW_READ_SHADOW_RAM_CMD;
220                 buffer.hdr.req.buf_lenh = 0;
221                 buffer.hdr.req.buf_lenl = FW_READ_SHADOW_RAM_LEN;
222                 buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
223
224                 /* convert offset from words to bytes */
225                 buffer.address = cpu_to_be32((offset + current_word) * 2);
226                 buffer.length = cpu_to_be16(words_to_read * 2);
227
228                 status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
229                                                       sizeof(buffer),
230                                                       IXGBE_HI_COMMAND_TIMEOUT,
231                                                       false);
232                 if (status) {
233                         hw_dbg(hw, "Host interface command failed\n");
234                         goto out;
235                 }
236
237                 for (i = 0; i < words_to_read; i++) {
238                         u32 reg = IXGBE_FLEX_MNG + (FW_NVM_DATA_OFFSET << 2) +
239                                   2 * i;
240                         u32 value = IXGBE_READ_REG(hw, reg);
241
242                         data[current_word] = (u16)(value & 0xffff);
243                         current_word++;
244                         i++;
245                         if (i < words_to_read) {
246                                 value >>= 16;
247                                 data[current_word] = (u16)(value & 0xffff);
248                                 current_word++;
249                         }
250                 }
251                 words -= words_to_read;
252         }
253
254 out:
255         hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
256         return status;
257 }
258
259 /** ixgbe_checksum_ptr_x550 - Checksum one pointer region
260  *  @hw: pointer to hardware structure
261  *  @ptr: pointer offset in eeprom
262  *  @size: size of section pointed by ptr, if 0 first word will be used as size
263  *  @csum: address of checksum to update
264  *
265  *  Returns error status for any failure
266  **/
267 static s32 ixgbe_checksum_ptr_x550(struct ixgbe_hw *hw, u16 ptr,
268                                    u16 size, u16 *csum, u16 *buffer,
269                                    u32 buffer_size)
270 {
271         u16 buf[256];
272         s32 status;
273         u16 length, bufsz, i, start;
274         u16 *local_buffer;
275
276         bufsz = sizeof(buf) / sizeof(buf[0]);
277
278         /* Read a chunk at the pointer location */
279         if (!buffer) {
280                 status = ixgbe_read_ee_hostif_buffer_X550(hw, ptr, bufsz, buf);
281                 if (status) {
282                         hw_dbg(hw, "Failed to read EEPROM image\n");
283                         return status;
284                 }
285                 local_buffer = buf;
286         } else {
287                 if (buffer_size < ptr)
288                         return  IXGBE_ERR_PARAM;
289                 local_buffer = &buffer[ptr];
290         }
291
292         if (size) {
293                 start = 0;
294                 length = size;
295         } else {
296                 start = 1;
297                 length = local_buffer[0];
298
299                 /* Skip pointer section if length is invalid. */
300                 if (length == 0xFFFF || length == 0 ||
301                     (ptr + length) >= hw->eeprom.word_size)
302                         return 0;
303         }
304
305         if (buffer && ((u32)start + (u32)length > buffer_size))
306                 return IXGBE_ERR_PARAM;
307
308         for (i = start; length; i++, length--) {
309                 if (i == bufsz && !buffer) {
310                         ptr += bufsz;
311                         i = 0;
312                         if (length < bufsz)
313                                 bufsz = length;
314
315                         /* Read a chunk at the pointer location */
316                         status = ixgbe_read_ee_hostif_buffer_X550(hw, ptr,
317                                                                   bufsz, buf);
318                         if (status) {
319                                 hw_dbg(hw, "Failed to read EEPROM image\n");
320                                 return status;
321                         }
322                 }
323                 *csum += local_buffer[i];
324         }
325         return 0;
326 }
327
328 /** ixgbe_calc_checksum_X550 - Calculates and returns the checksum
329  *  @hw: pointer to hardware structure
330  *  @buffer: pointer to buffer containing calculated checksum
331  *  @buffer_size: size of buffer
332  *
333  *  Returns a negative error code on error, or the 16-bit checksum
334  **/
335 static s32 ixgbe_calc_checksum_X550(struct ixgbe_hw *hw, u16 *buffer,
336                                     u32 buffer_size)
337 {
338         u16 eeprom_ptrs[IXGBE_EEPROM_LAST_WORD + 1];
339         u16 *local_buffer;
340         s32 status;
341         u16 checksum = 0;
342         u16 pointer, i, size;
343
344         hw->eeprom.ops.init_params(hw);
345
346         if (!buffer) {
347                 /* Read pointer area */
348                 status = ixgbe_read_ee_hostif_buffer_X550(hw, 0,
349                                                 IXGBE_EEPROM_LAST_WORD + 1,
350                                                 eeprom_ptrs);
351                 if (status) {
352                         hw_dbg(hw, "Failed to read EEPROM image\n");
353                         return status;
354                 }
355                 local_buffer = eeprom_ptrs;
356         } else {
357                 if (buffer_size < IXGBE_EEPROM_LAST_WORD)
358                         return IXGBE_ERR_PARAM;
359                 local_buffer = buffer;
360         }
361
362         /* For X550 hardware include 0x0-0x41 in the checksum, skip the
363          * checksum word itself
364          */
365         for (i = 0; i <= IXGBE_EEPROM_LAST_WORD; i++)
366                 if (i != IXGBE_EEPROM_CHECKSUM)
367                         checksum += local_buffer[i];
368
369         /* Include all data from pointers 0x3, 0x6-0xE.  This excludes the
370          * FW, PHY module, and PCIe Expansion/Option ROM pointers.
371          */
372         for (i = IXGBE_PCIE_ANALOG_PTR_X550; i < IXGBE_FW_PTR; i++) {
373                 if (i == IXGBE_PHY_PTR || i == IXGBE_OPTION_ROM_PTR)
374                         continue;
375
376                 pointer = local_buffer[i];
377
378                 /* Skip pointer section if the pointer is invalid. */
379                 if (pointer == 0xFFFF || pointer == 0 ||
380                     pointer >= hw->eeprom.word_size)
381                         continue;
382
383                 switch (i) {
384                 case IXGBE_PCIE_GENERAL_PTR:
385                         size = IXGBE_IXGBE_PCIE_GENERAL_SIZE;
386                         break;
387                 case IXGBE_PCIE_CONFIG0_PTR:
388                 case IXGBE_PCIE_CONFIG1_PTR:
389                         size = IXGBE_PCIE_CONFIG_SIZE;
390                         break;
391                 default:
392                         size = 0;
393                         break;
394                 }
395
396                 status = ixgbe_checksum_ptr_x550(hw, pointer, size, &checksum,
397                                                  buffer, buffer_size);
398                 if (status)
399                         return status;
400         }
401
402         checksum = (u16)IXGBE_EEPROM_SUM - checksum;
403
404         return (s32)checksum;
405 }
406
407 /** ixgbe_calc_eeprom_checksum_X550 - Calculates and returns the checksum
408  *  @hw: pointer to hardware structure
409  *
410  *  Returns a negative error code on error, or the 16-bit checksum
411  **/
412 static s32 ixgbe_calc_eeprom_checksum_X550(struct ixgbe_hw *hw)
413 {
414         return ixgbe_calc_checksum_X550(hw, NULL, 0);
415 }
416
417 /** ixgbe_read_ee_hostif_X550 - Read EEPROM word using a host interface command
418  *  @hw: pointer to hardware structure
419  *  @offset: offset of  word in the EEPROM to read
420  *  @data: word read from the EEPROM
421  *
422  *   Reads a 16 bit word from the EEPROM using the hostif.
423  **/
424 static s32 ixgbe_read_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset, u16 *data)
425 {
426         s32 status = 0;
427
428         if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) == 0) {
429                 status = ixgbe_read_ee_hostif_data_X550(hw, offset, data);
430                 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
431         } else {
432                 status = IXGBE_ERR_SWFW_SYNC;
433         }
434
435         return status;
436 }
437
438 /** ixgbe_validate_eeprom_checksum_X550 - Validate EEPROM checksum
439  *  @hw: pointer to hardware structure
440  *  @checksum_val: calculated checksum
441  *
442  *  Performs checksum calculation and validates the EEPROM checksum.  If the
443  *  caller does not need checksum_val, the value can be NULL.
444  **/
445 static s32 ixgbe_validate_eeprom_checksum_X550(struct ixgbe_hw *hw,
446                                                u16 *checksum_val)
447 {
448         s32 status;
449         u16 checksum;
450         u16 read_checksum = 0;
451
452         /* Read the first word from the EEPROM. If this times out or fails, do
453          * not continue or we could be in for a very long wait while every
454          * EEPROM read fails
455          */
456         status = hw->eeprom.ops.read(hw, 0, &checksum);
457         if (status) {
458                 hw_dbg(hw, "EEPROM read failed\n");
459                 return status;
460         }
461
462         status = hw->eeprom.ops.calc_checksum(hw);
463         if (status < 0)
464                 return status;
465
466         checksum = (u16)(status & 0xffff);
467
468         status = ixgbe_read_ee_hostif_X550(hw, IXGBE_EEPROM_CHECKSUM,
469                                            &read_checksum);
470         if (status)
471                 return status;
472
473         /* Verify read checksum from EEPROM is the same as
474          * calculated checksum
475          */
476         if (read_checksum != checksum) {
477                 status = IXGBE_ERR_EEPROM_CHECKSUM;
478                 hw_dbg(hw, "Invalid EEPROM checksum");
479         }
480
481         /* If the user cares, return the calculated checksum */
482         if (checksum_val)
483                 *checksum_val = checksum;
484
485         return status;
486 }
487
488 /** ixgbe_write_ee_hostif_X550 - Write EEPROM word using hostif
489  *  @hw: pointer to hardware structure
490  *  @offset: offset of  word in the EEPROM to write
491  *  @data: word write to the EEPROM
492  *
493  *  Write a 16 bit word to the EEPROM using the hostif.
494  **/
495 static s32 ixgbe_write_ee_hostif_data_X550(struct ixgbe_hw *hw, u16 offset,
496                                            u16 data)
497 {
498         s32 status;
499         struct ixgbe_hic_write_shadow_ram buffer;
500
501         buffer.hdr.req.cmd = FW_WRITE_SHADOW_RAM_CMD;
502         buffer.hdr.req.buf_lenh = 0;
503         buffer.hdr.req.buf_lenl = FW_WRITE_SHADOW_RAM_LEN;
504         buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
505
506         /* one word */
507         buffer.length = cpu_to_be16(sizeof(u16));
508         buffer.data = data;
509         buffer.address = cpu_to_be32(offset * 2);
510
511         status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
512                                               sizeof(buffer),
513                                               IXGBE_HI_COMMAND_TIMEOUT, false);
514         return status;
515 }
516
517 /** ixgbe_write_ee_hostif_X550 - Write EEPROM word using hostif
518  *  @hw: pointer to hardware structure
519  *  @offset: offset of  word in the EEPROM to write
520  *  @data: word write to the EEPROM
521  *
522  *  Write a 16 bit word to the EEPROM using the hostif.
523  **/
524 static s32 ixgbe_write_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset, u16 data)
525 {
526         s32 status = 0;
527
528         if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) == 0) {
529                 status = ixgbe_write_ee_hostif_data_X550(hw, offset, data);
530                 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
531         } else {
532                 hw_dbg(hw, "write ee hostif failed to get semaphore");
533                 status = IXGBE_ERR_SWFW_SYNC;
534         }
535
536         return status;
537 }
538
539 /** ixgbe_update_flash_X550 - Instruct HW to copy EEPROM to Flash device
540  *  @hw: pointer to hardware structure
541  *
542  *  Issue a shadow RAM dump to FW to copy EEPROM from shadow RAM to the flash.
543  **/
544 static s32 ixgbe_update_flash_X550(struct ixgbe_hw *hw)
545 {
546         s32 status = 0;
547         union ixgbe_hic_hdr2 buffer;
548
549         buffer.req.cmd = FW_SHADOW_RAM_DUMP_CMD;
550         buffer.req.buf_lenh = 0;
551         buffer.req.buf_lenl = FW_SHADOW_RAM_DUMP_LEN;
552         buffer.req.checksum = FW_DEFAULT_CHECKSUM;
553
554         status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
555                                               sizeof(buffer),
556                                               IXGBE_HI_COMMAND_TIMEOUT, false);
557         return status;
558 }
559
560 /** ixgbe_disable_rx_x550 - Disable RX unit
561  *
562  *  Enables the Rx DMA unit for x550
563  **/
564 static void ixgbe_disable_rx_x550(struct ixgbe_hw *hw)
565 {
566         u32 rxctrl, pfdtxgswc;
567         s32 status;
568         struct ixgbe_hic_disable_rxen fw_cmd;
569
570         rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
571         if (rxctrl & IXGBE_RXCTRL_RXEN) {
572                 pfdtxgswc = IXGBE_READ_REG(hw, IXGBE_PFDTXGSWC);
573                 if (pfdtxgswc & IXGBE_PFDTXGSWC_VT_LBEN) {
574                         pfdtxgswc &= ~IXGBE_PFDTXGSWC_VT_LBEN;
575                         IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, pfdtxgswc);
576                         hw->mac.set_lben = true;
577                 } else {
578                         hw->mac.set_lben = false;
579                 }
580
581                 fw_cmd.hdr.cmd = FW_DISABLE_RXEN_CMD;
582                 fw_cmd.hdr.buf_len = FW_DISABLE_RXEN_LEN;
583                 fw_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
584                 fw_cmd.port_number = (u8)hw->bus.lan_id;
585
586                 status = ixgbe_host_interface_command(hw, (u32 *)&fw_cmd,
587                                         sizeof(struct ixgbe_hic_disable_rxen),
588                                         IXGBE_HI_COMMAND_TIMEOUT, true);
589
590                 /* If we fail - disable RX using register write */
591                 if (status) {
592                         rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
593                         if (rxctrl & IXGBE_RXCTRL_RXEN) {
594                                 rxctrl &= ~IXGBE_RXCTRL_RXEN;
595                                 IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxctrl);
596                         }
597                 }
598         }
599 }
600
601 /** ixgbe_update_eeprom_checksum_X550 - Updates the EEPROM checksum and flash
602  *  @hw: pointer to hardware structure
603  *
604  *  After writing EEPROM to shadow RAM using EEWR register, software calculates
605  *  checksum and updates the EEPROM and instructs the hardware to update
606  *  the flash.
607  **/
608 static s32 ixgbe_update_eeprom_checksum_X550(struct ixgbe_hw *hw)
609 {
610         s32 status;
611         u16 checksum = 0;
612
613         /* Read the first word from the EEPROM. If this times out or fails, do
614          * not continue or we could be in for a very long wait while every
615          * EEPROM read fails
616          */
617         status = ixgbe_read_ee_hostif_X550(hw, 0, &checksum);
618         if (status) {
619                 hw_dbg(hw, "EEPROM read failed\n");
620                 return status;
621         }
622
623         status = ixgbe_calc_eeprom_checksum_X550(hw);
624         if (status < 0)
625                 return status;
626
627         checksum = (u16)(status & 0xffff);
628
629         status = ixgbe_write_ee_hostif_X550(hw, IXGBE_EEPROM_CHECKSUM,
630                                             checksum);
631         if (status)
632                 return status;
633
634         status = ixgbe_update_flash_X550(hw);
635
636         return status;
637 }
638
639 /** ixgbe_write_ee_hostif_buffer_X550 - Write EEPROM word(s) using hostif
640  *  @hw: pointer to hardware structure
641  *  @offset: offset of  word in the EEPROM to write
642  *  @words: number of words
643  *  @data: word(s) write to the EEPROM
644  *
645  *
646  *  Write a 16 bit word(s) to the EEPROM using the hostif.
647  **/
648 static s32 ixgbe_write_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
649                                              u16 offset, u16 words,
650                                              u16 *data)
651 {
652         s32 status = 0;
653         u32 i = 0;
654
655         /* Take semaphore for the entire operation. */
656         status = hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
657         if (status) {
658                 hw_dbg(hw, "EEPROM write buffer - semaphore failed\n");
659                 return status;
660         }
661
662         for (i = 0; i < words; i++) {
663                 status = ixgbe_write_ee_hostif_data_X550(hw, offset + i,
664                                                          data[i]);
665                 if (status) {
666                         hw_dbg(hw, "Eeprom buffered write failed\n");
667                         break;
668                 }
669         }
670
671         hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
672
673         return status;
674 }
675
676 /** ixgbe_init_mac_link_ops_X550em - init mac link function pointers
677  *  @hw: pointer to hardware structure
678  **/
679 static void ixgbe_init_mac_link_ops_X550em(struct ixgbe_hw *hw)
680 {
681         struct ixgbe_mac_info *mac = &hw->mac;
682
683         /* CS4227 does not support autoneg, so disable the laser control
684          * functions for SFP+ fiber
685          */
686         if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP) {
687                 mac->ops.disable_tx_laser = NULL;
688                 mac->ops.enable_tx_laser = NULL;
689                 mac->ops.flap_tx_laser = NULL;
690         }
691 }
692
693 /** ixgbe_setup_sfp_modules_X550em - Setup SFP module
694  * @hw: pointer to hardware structure
695  */
696 static s32 ixgbe_setup_sfp_modules_X550em(struct ixgbe_hw *hw)
697 {
698         bool setup_linear;
699         u16 reg_slice, edc_mode;
700         s32 ret_val;
701
702         switch (hw->phy.sfp_type) {
703         case ixgbe_sfp_type_unknown:
704                 return 0;
705         case ixgbe_sfp_type_not_present:
706                 return IXGBE_ERR_SFP_NOT_PRESENT;
707         case ixgbe_sfp_type_da_cu_core0:
708         case ixgbe_sfp_type_da_cu_core1:
709                 setup_linear = true;
710                 break;
711         case ixgbe_sfp_type_srlr_core0:
712         case ixgbe_sfp_type_srlr_core1:
713         case ixgbe_sfp_type_da_act_lmt_core0:
714         case ixgbe_sfp_type_da_act_lmt_core1:
715         case ixgbe_sfp_type_1g_sx_core0:
716         case ixgbe_sfp_type_1g_sx_core1:
717                 setup_linear = false;
718                 break;
719         default:
720                 return IXGBE_ERR_SFP_NOT_SUPPORTED;
721         }
722
723         ixgbe_init_mac_link_ops_X550em(hw);
724         hw->phy.ops.reset = NULL;
725
726         /* The CS4227 slice address is the base address + the port-pair reg
727          * offset. I.e. Slice 0 = 0x12B0 and slice 1 = 0x22B0.
728          */
729         reg_slice = IXGBE_CS4227_SPARE24_LSB + (hw->bus.lan_id << 12);
730
731         if (setup_linear)
732                 edc_mode = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
733         else
734                 edc_mode = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
735
736         /* Configure CS4227 for connection type. */
737         ret_val = hw->phy.ops.write_i2c_combined(hw, IXGBE_CS4227, reg_slice,
738                                                  edc_mode);
739
740         if (ret_val)
741                 ret_val = hw->phy.ops.write_i2c_combined(hw, 0x80, reg_slice,
742                                                          edc_mode);
743
744         return ret_val;
745 }
746
747 /** ixgbe_get_link_capabilities_x550em - Determines link capabilities
748  * @hw: pointer to hardware structure
749  * @speed: pointer to link speed
750  * @autoneg: true when autoneg or autotry is enabled
751  **/
752 static s32 ixgbe_get_link_capabilities_X550em(struct ixgbe_hw *hw,
753                                               ixgbe_link_speed *speed,
754                                               bool *autoneg)
755 {
756         /* SFP */
757         if (hw->phy.media_type == ixgbe_media_type_fiber) {
758                 /* CS4227 SFP must not enable auto-negotiation */
759                 *autoneg = false;
760
761                 if (hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
762                     hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1) {
763                         *speed = IXGBE_LINK_SPEED_1GB_FULL;
764                         return 0;
765                 }
766
767                 /* Link capabilities are based on SFP */
768                 if (hw->phy.multispeed_fiber)
769                         *speed = IXGBE_LINK_SPEED_10GB_FULL |
770                                  IXGBE_LINK_SPEED_1GB_FULL;
771                 else
772                         *speed = IXGBE_LINK_SPEED_10GB_FULL;
773         } else {
774                 *speed = IXGBE_LINK_SPEED_10GB_FULL |
775                          IXGBE_LINK_SPEED_1GB_FULL;
776                 *autoneg = true;
777         }
778         return 0;
779 }
780
781 /** ixgbe_write_iosf_sb_reg_x550 - Writes a value to specified register of the
782  *  IOSF device
783  *
784  *  @hw: pointer to hardware structure
785  *  @reg_addr: 32 bit PHY register to write
786  *  @device_type: 3 bit device type
787  *  @data: Data to write to the register
788  **/
789 static s32 ixgbe_write_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
790                                         u32 device_type, u32 data)
791 {
792         u32 i, command, error;
793
794         command = ((reg_addr << IXGBE_SB_IOSF_CTRL_ADDR_SHIFT) |
795                    (device_type << IXGBE_SB_IOSF_CTRL_TARGET_SELECT_SHIFT));
796
797         /* Write IOSF control register */
798         IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL, command);
799
800         /* Write IOSF data register */
801         IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_DATA, data);
802
803         /* Check every 10 usec to see if the address cycle completed.
804          * The SB IOSF BUSY bit will clear when the operation is
805          * complete
806          */
807         for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
808                 usleep_range(10, 20);
809
810                 command = IXGBE_READ_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL);
811                 if ((command & IXGBE_SB_IOSF_CTRL_BUSY) == 0)
812                         break;
813         }
814
815         if ((command & IXGBE_SB_IOSF_CTRL_RESP_STAT_MASK) != 0) {
816                 error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
817                          IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
818                 hw_dbg(hw, "Failed to write, error %x\n", error);
819                 return IXGBE_ERR_PHY;
820         }
821
822         if (i == IXGBE_MDIO_COMMAND_TIMEOUT) {
823                 hw_dbg(hw, "Write timed out\n");
824                 return IXGBE_ERR_PHY;
825         }
826
827         return 0;
828 }
829
830 /** ixgbe_setup_ixfi_x550em - Configure the KR PHY for iXFI mode.
831  *  @hw: pointer to hardware structure
832  *  @speed: the link speed to force
833  *
834  *  Configures the integrated KR PHY to use iXFI mode. Used to connect an
835  *  internal and external PHY at a specific speed, without autonegotiation.
836  **/
837 static s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
838 {
839         s32 status;
840         u32 reg_val;
841
842         /* Disable AN and force speed to 10G Serial. */
843         status = ixgbe_read_iosf_sb_reg_x550(hw,
844                                         IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
845                                         IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
846         if (status)
847                 return status;
848
849         reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
850         reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
851
852         /* Select forced link speed for internal PHY. */
853         switch (*speed) {
854         case IXGBE_LINK_SPEED_10GB_FULL:
855                 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_10G;
856                 break;
857         case IXGBE_LINK_SPEED_1GB_FULL:
858                 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G;
859                 break;
860         default:
861                 /* Other link speeds are not supported by internal KR PHY. */
862                 return IXGBE_ERR_LINK_SETUP;
863         }
864
865         status = ixgbe_write_iosf_sb_reg_x550(hw,
866                                 IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
867                                 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
868         if (status)
869                 return status;
870
871         /* Disable training protocol FSM. */
872         status = ixgbe_read_iosf_sb_reg_x550(hw,
873                                 IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
874                                 IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
875         if (status)
876                 return status;
877
878         reg_val |= IXGBE_KRM_RX_TRN_LINKUP_CTRL_CONV_WO_PROTOCOL;
879         status = ixgbe_write_iosf_sb_reg_x550(hw,
880                                 IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
881                                 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
882         if (status)
883                 return status;
884
885         /* Disable Flex from training TXFFE. */
886         status = ixgbe_read_iosf_sb_reg_x550(hw,
887                                 IXGBE_KRM_DSP_TXFFE_STATE_4(hw->bus.lan_id),
888                                 IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
889         if (status)
890                 return status;
891
892         reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_C0_EN;
893         reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CP1_CN1_EN;
894         reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CO_ADAPT_EN;
895         status = ixgbe_write_iosf_sb_reg_x550(hw,
896                                 IXGBE_KRM_DSP_TXFFE_STATE_4(hw->bus.lan_id),
897                                 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
898         if (status)
899                 return status;
900
901         status = ixgbe_read_iosf_sb_reg_x550(hw,
902                                 IXGBE_KRM_DSP_TXFFE_STATE_5(hw->bus.lan_id),
903                                 IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
904         if (status)
905                 return status;
906
907         reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_C0_EN;
908         reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CP1_CN1_EN;
909         reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CO_ADAPT_EN;
910         status = ixgbe_write_iosf_sb_reg_x550(hw,
911                                 IXGBE_KRM_DSP_TXFFE_STATE_5(hw->bus.lan_id),
912                                 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
913         if (status)
914                 return status;
915
916         /* Enable override for coefficients. */
917         status = ixgbe_read_iosf_sb_reg_x550(hw,
918                                 IXGBE_KRM_TX_COEFF_CTRL_1(hw->bus.lan_id),
919                                 IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
920         if (status)
921                 return status;
922
923         reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_OVRRD_EN;
924         reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CZERO_EN;
925         reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CPLUS1_OVRRD_EN;
926         reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CMINUS1_OVRRD_EN;
927         status = ixgbe_write_iosf_sb_reg_x550(hw,
928                                 IXGBE_KRM_TX_COEFF_CTRL_1(hw->bus.lan_id),
929                                 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
930         if (status)
931                 return status;
932
933         /* Toggle port SW reset by AN reset. */
934         status = ixgbe_read_iosf_sb_reg_x550(hw,
935                                 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
936                                 IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
937         if (status)
938                 return status;
939
940         reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_RESTART;
941         status = ixgbe_write_iosf_sb_reg_x550(hw,
942                                 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
943                                 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
944
945         return status;
946 }
947
948 /** ixgbe_setup_kx4_x550em - Configure the KX4 PHY.
949  *  @hw: pointer to hardware structure
950  *
951  *   Configures the integrated KX4 PHY.
952  **/
953 static s32 ixgbe_setup_kx4_x550em(struct ixgbe_hw *hw)
954 {
955         s32 status;
956         u32 reg_val;
957
958         status = ixgbe_read_iosf_sb_reg_x550(hw, IXGBE_KX4_LINK_CNTL_1,
959                                              IXGBE_SB_IOSF_TARGET_KX4_PCS0 +
960                                              hw->bus.lan_id, &reg_val);
961         if (status)
962                 return status;
963
964         reg_val &= ~(IXGBE_KX4_LINK_CNTL_1_TETH_AN_CAP_KX4 |
965                      IXGBE_KX4_LINK_CNTL_1_TETH_AN_CAP_KX);
966
967         reg_val |= IXGBE_KX4_LINK_CNTL_1_TETH_AN_ENABLE;
968
969         /* Advertise 10G support. */
970         if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
971                 reg_val |= IXGBE_KX4_LINK_CNTL_1_TETH_AN_CAP_KX4;
972
973         /* Advertise 1G support. */
974         if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
975                 reg_val |= IXGBE_KX4_LINK_CNTL_1_TETH_AN_CAP_KX;
976
977         /* Restart auto-negotiation. */
978         reg_val |= IXGBE_KX4_LINK_CNTL_1_TETH_AN_RESTART;
979         status = ixgbe_write_iosf_sb_reg_x550(hw, IXGBE_KX4_LINK_CNTL_1,
980                                               IXGBE_SB_IOSF_TARGET_KX4_PCS0 +
981                                               hw->bus.lan_id, reg_val);
982
983         return status;
984 }
985
986 /**  ixgbe_setup_kr_x550em - Configure the KR PHY.
987  *   @hw: pointer to hardware structure
988  *
989  *   Configures the integrated KR PHY.
990  **/
991 static s32 ixgbe_setup_kr_x550em(struct ixgbe_hw *hw)
992 {
993         s32 status;
994         u32 reg_val;
995
996         status = ixgbe_read_iosf_sb_reg_x550(hw,
997                                         IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
998                                         IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
999         if (status)
1000                 return status;
1001
1002         reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
1003         reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_FEC_REQ;
1004         reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_FEC;
1005         reg_val &= ~(IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KR |
1006                      IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX);
1007
1008         /* Advertise 10G support. */
1009         if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
1010                 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KR;
1011
1012         /* Advertise 1G support. */
1013         if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
1014                 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX;
1015
1016         /* Restart auto-negotiation. */
1017         reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_RESTART;
1018         status = ixgbe_write_iosf_sb_reg_x550(hw,
1019                                         IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
1020                                         IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
1021
1022         return status;
1023 }
1024
1025 /** ixgbe_setup_internal_phy_x550em - Configure integrated KR PHY
1026  *  @hw: point to hardware structure
1027  *
1028  *  Configures the integrated KR PHY to talk to the external PHY. The base
1029  *  driver will call this function when it gets notification via interrupt from
1030  *  the external PHY. This function forces the internal PHY into iXFI mode at
1031  *  the correct speed.
1032  *
1033  *  A return of a non-zero value indicates an error, and the base driver should
1034  *  not report link up.
1035  **/
1036 static s32 ixgbe_setup_internal_phy_x550em(struct ixgbe_hw *hw)
1037 {
1038         u32 status;
1039         u16 lasi, autoneg_status, speed;
1040         ixgbe_link_speed force_speed;
1041
1042         /* Verify that the external link status has changed */
1043         status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_XENPAK_LASI_STATUS,
1044                                       IXGBE_MDIO_PMA_PMD_DEV_TYPE, &lasi);
1045         if (status)
1046                 return status;
1047
1048         /* If there was no change in link status, we can just exit */
1049         if (!(lasi & IXGBE_XENPAK_LASI_LINK_STATUS_ALARM))
1050                 return 0;
1051
1052         /* we read this twice back to back to indicate current status */
1053         status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
1054                                       IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
1055                                       &autoneg_status);
1056         if (status)
1057                 return status;
1058
1059         status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
1060                                       IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
1061                                       &autoneg_status);
1062         if (status)
1063                 return status;
1064
1065         /* If link is not up return an error indicating treat link as down */
1066         if (!(autoneg_status & IXGBE_MDIO_AUTO_NEG_LINK_STATUS))
1067                 return IXGBE_ERR_INVALID_LINK_SETTINGS;
1068
1069         status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_STAT,
1070                                       IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
1071                                       &speed);
1072
1073         /* clear everything but the speed and duplex bits */
1074         speed &= IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_MASK;
1075
1076         switch (speed) {
1077         case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_10GB_FULL:
1078                 force_speed = IXGBE_LINK_SPEED_10GB_FULL;
1079                 break;
1080         case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_1GB_FULL:
1081                 force_speed = IXGBE_LINK_SPEED_1GB_FULL;
1082                 break;
1083         default:
1084                 /* Internal PHY does not support anything else */
1085                 return IXGBE_ERR_INVALID_LINK_SETTINGS;
1086         }
1087
1088         return ixgbe_setup_ixfi_x550em(hw, &force_speed);
1089 }
1090
1091 /** ixgbe_init_phy_ops_X550em - PHY/SFP specific init
1092  *  @hw: pointer to hardware structure
1093  *
1094  *  Initialize any function pointers that were not able to be
1095  *  set during init_shared_code because the PHY/SFP type was
1096  *  not known.  Perform the SFP init if necessary.
1097  **/
1098 static s32 ixgbe_init_phy_ops_X550em(struct ixgbe_hw *hw)
1099 {
1100         struct ixgbe_phy_info *phy = &hw->phy;
1101         s32 ret_val;
1102         u32 esdp;
1103
1104         if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP) {
1105                 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
1106                 phy->phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM;
1107
1108                 if (hw->bus.lan_id) {
1109                         esdp &= ~(IXGBE_ESDP_SDP1_NATIVE | IXGBE_ESDP_SDP1);
1110                         esdp |= IXGBE_ESDP_SDP1_DIR;
1111                 }
1112                 esdp &= ~(IXGBE_ESDP_SDP0_NATIVE | IXGBE_ESDP_SDP0_DIR);
1113                 IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
1114         }
1115
1116         /* Identify the PHY or SFP module */
1117         ret_val = phy->ops.identify(hw);
1118
1119         /* Setup function pointers based on detected SFP module and speeds */
1120         ixgbe_init_mac_link_ops_X550em(hw);
1121         if (phy->sfp_type != ixgbe_sfp_type_unknown)
1122                 phy->ops.reset = NULL;
1123
1124         /* Set functions pointers based on phy type */
1125         switch (hw->phy.type) {
1126         case ixgbe_phy_x550em_kx4:
1127                 phy->ops.setup_link = ixgbe_setup_kx4_x550em;
1128                 phy->ops.read_reg = ixgbe_read_phy_reg_x550em;
1129                 phy->ops.write_reg = ixgbe_write_phy_reg_x550em;
1130                 break;
1131         case ixgbe_phy_x550em_kr:
1132                 phy->ops.setup_link = ixgbe_setup_kr_x550em;
1133                 phy->ops.read_reg = ixgbe_read_phy_reg_x550em;
1134                 phy->ops.write_reg = ixgbe_write_phy_reg_x550em;
1135                 break;
1136         case ixgbe_phy_x550em_ext_t:
1137                 phy->ops.setup_internal_link = ixgbe_setup_internal_phy_x550em;
1138                 break;
1139         default:
1140                 break;
1141         }
1142         return ret_val;
1143 }
1144
1145 /** ixgbe_get_media_type_X550em - Get media type
1146  *  @hw: pointer to hardware structure
1147  *
1148  *  Returns the media type (fiber, copper, backplane)
1149  *
1150  */
1151 static enum ixgbe_media_type ixgbe_get_media_type_X550em(struct ixgbe_hw *hw)
1152 {
1153         enum ixgbe_media_type media_type;
1154
1155         /* Detect if there is a copper PHY attached. */
1156         switch (hw->device_id) {
1157         case IXGBE_DEV_ID_X550EM_X_KR:
1158         case IXGBE_DEV_ID_X550EM_X_KX4:
1159                 media_type = ixgbe_media_type_backplane;
1160                 break;
1161         case IXGBE_DEV_ID_X550EM_X_SFP:
1162                 media_type = ixgbe_media_type_fiber;
1163                 break;
1164         case IXGBE_DEV_ID_X550EM_X_1G_T:
1165         case IXGBE_DEV_ID_X550EM_X_10G_T:
1166                  media_type = ixgbe_media_type_copper;
1167                 break;
1168         default:
1169                 media_type = ixgbe_media_type_unknown;
1170                 break;
1171         }
1172         return media_type;
1173 }
1174
1175 /** ixgbe_init_ext_t_x550em - Start (unstall) the external Base T PHY.
1176  ** @hw: pointer to hardware structure
1177  **/
1178 static s32 ixgbe_init_ext_t_x550em(struct ixgbe_hw *hw)
1179 {
1180         u32 status;
1181         u16 reg;
1182         u32 retries = 2;
1183
1184         do {
1185                 /* decrement retries counter and exit if we hit 0 */
1186                 if (retries < 1) {
1187                         hw_dbg(hw, "External PHY not yet finished resetting.");
1188                         return IXGBE_ERR_PHY;
1189                 }
1190                 retries--;
1191
1192                 status = hw->phy.ops.read_reg(hw,
1193                                               IXGBE_MDIO_TX_VENDOR_ALARMS_3,
1194                                               IXGBE_MDIO_PMA_PMD_DEV_TYPE,
1195                                               &reg);
1196                 if (status)
1197                         return status;
1198
1199                 /* Verify PHY FW reset has completed */
1200         } while ((reg & IXGBE_MDIO_TX_VENDOR_ALARMS_3_RST_MASK) != 1);
1201
1202         /* Set port to low power mode */
1203         status = hw->phy.ops.read_reg(hw,
1204                                       IXGBE_MDIO_VENDOR_SPECIFIC_1_CONTROL,
1205                                       IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
1206                                       &reg);
1207         if (status)
1208                 return status;
1209
1210         /* Enable the transmitter */
1211         status = hw->phy.ops.read_reg(hw,
1212                                       IXGBE_MDIO_PMD_STD_TX_DISABLE_CNTR,
1213                                       IXGBE_MDIO_PMA_PMD_DEV_TYPE,
1214                                       &reg);
1215         if (status)
1216                 return status;
1217
1218         reg &= ~IXGBE_MDIO_PMD_GLOBAL_TX_DISABLE;
1219
1220         status = hw->phy.ops.write_reg(hw,
1221                                        IXGBE_MDIO_PMD_STD_TX_DISABLE_CNTR,
1222                                        IXGBE_MDIO_PMA_PMD_DEV_TYPE,
1223                                        reg);
1224         if (status)
1225                 return status;
1226
1227         /* Un-stall the PHY FW */
1228         status = hw->phy.ops.read_reg(hw,
1229                                       IXGBE_MDIO_GLOBAL_RES_PR_10,
1230                                       IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
1231                                       &reg);
1232         if (status)
1233                 return status;
1234
1235         reg &= ~IXGBE_MDIO_POWER_UP_STALL;
1236
1237         status = hw->phy.ops.write_reg(hw,
1238                                        IXGBE_MDIO_GLOBAL_RES_PR_10,
1239                                        IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
1240                                        reg);
1241         return status;
1242 }
1243
1244 /**  ixgbe_reset_hw_X550em - Perform hardware reset
1245  **  @hw: pointer to hardware structure
1246  **
1247  **  Resets the hardware by resetting the transmit and receive units, masks
1248  **  and clears all interrupts, perform a PHY reset, and perform a link (MAC)
1249  **  reset.
1250  **/
1251 static s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)
1252 {
1253         ixgbe_link_speed link_speed;
1254         s32 status;
1255         u32 ctrl = 0;
1256         u32 i;
1257         bool link_up = false;
1258
1259         /* Call adapter stop to disable Tx/Rx and clear interrupts */
1260         status = hw->mac.ops.stop_adapter(hw);
1261         if (status)
1262                 return status;
1263
1264         /* flush pending Tx transactions */
1265         ixgbe_clear_tx_pending(hw);
1266
1267         /* PHY ops must be identified and initialized prior to reset */
1268
1269         /* Identify PHY and related function pointers */
1270         status = hw->phy.ops.init(hw);
1271
1272         /* start the external PHY */
1273         if (hw->phy.type == ixgbe_phy_x550em_ext_t) {
1274                 status = ixgbe_init_ext_t_x550em(hw);
1275                 if (status)
1276                         return status;
1277         }
1278
1279         /* Setup SFP module if there is one present. */
1280         if (hw->phy.sfp_setup_needed) {
1281                 status = hw->mac.ops.setup_sfp(hw);
1282                 hw->phy.sfp_setup_needed = false;
1283         }
1284
1285         /* Reset PHY */
1286         if (!hw->phy.reset_disable && hw->phy.ops.reset)
1287                 hw->phy.ops.reset(hw);
1288
1289 mac_reset_top:
1290         /* Issue global reset to the MAC.  Needs to be SW reset if link is up.
1291          * If link reset is used when link is up, it might reset the PHY when
1292          * mng is using it.  If link is down or the flag to force full link
1293          * reset is set, then perform link reset.
1294          */
1295         ctrl = IXGBE_CTRL_LNK_RST;
1296
1297         if (!hw->force_full_reset) {
1298                 hw->mac.ops.check_link(hw, &link_speed, &link_up, false);
1299                 if (link_up)
1300                         ctrl = IXGBE_CTRL_RST;
1301         }
1302
1303         ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
1304         IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
1305         IXGBE_WRITE_FLUSH(hw);
1306
1307         /* Poll for reset bit to self-clear meaning reset is complete */
1308         for (i = 0; i < 10; i++) {
1309                 udelay(1);
1310                 ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL);
1311                 if (!(ctrl & IXGBE_CTRL_RST_MASK))
1312                         break;
1313         }
1314
1315         if (ctrl & IXGBE_CTRL_RST_MASK) {
1316                 status = IXGBE_ERR_RESET_FAILED;
1317                 hw_dbg(hw, "Reset polling failed to complete.\n");
1318         }
1319
1320         msleep(50);
1321
1322         /* Double resets are required for recovery from certain error
1323          * clear the multicast table.  Also reset num_rar_entries to 128,
1324          * since we modify this value when programming the SAN MAC address.
1325          */
1326         if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {
1327                 hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
1328                 goto mac_reset_top;
1329         }
1330
1331         /* Store the permanent mac address */
1332         hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
1333
1334         /* Store MAC address from RAR0, clear receive address registers, and
1335          * clear the multicast table.  Also reset num_rar_entries to 128,
1336          * since we modify this value when programming the SAN MAC address.
1337          */
1338         hw->mac.num_rar_entries = 128;
1339         hw->mac.ops.init_rx_addrs(hw);
1340
1341         return status;
1342 }
1343
1344 /** ixgbe_set_ethertype_anti_spoofing_X550 - Enable/Disable Ethertype
1345  *      anti-spoofing
1346  *  @hw:  pointer to hardware structure
1347  *  @enable: enable or disable switch for Ethertype anti-spoofing
1348  *  @vf: Virtual Function pool - VF Pool to set for Ethertype anti-spoofing
1349  **/
1350 static void ixgbe_set_ethertype_anti_spoofing_X550(struct ixgbe_hw *hw,
1351                                                    bool enable, int vf)
1352 {
1353         int vf_target_reg = vf >> 3;
1354         int vf_target_shift = vf % 8 + IXGBE_SPOOF_ETHERTYPEAS_SHIFT;
1355         u32 pfvfspoof;
1356
1357         pfvfspoof = IXGBE_READ_REG(hw, IXGBE_PFVFSPOOF(vf_target_reg));
1358         if (enable)
1359                 pfvfspoof |= (1 << vf_target_shift);
1360         else
1361                 pfvfspoof &= ~(1 << vf_target_shift);
1362
1363         IXGBE_WRITE_REG(hw, IXGBE_PFVFSPOOF(vf_target_reg), pfvfspoof);
1364 }
1365
1366 /** ixgbe_set_source_address_pruning_X550 - Enable/Disbale src address pruning
1367  *  @hw: pointer to hardware structure
1368  *  @enable: enable or disable source address pruning
1369  *  @pool: Rx pool to set source address pruning for
1370  **/
1371 static void ixgbe_set_source_address_pruning_X550(struct ixgbe_hw *hw,
1372                                                   bool enable,
1373                                                   unsigned int pool)
1374 {
1375         u64 pfflp;
1376
1377         /* max rx pool is 63 */
1378         if (pool > 63)
1379                 return;
1380
1381         pfflp = (u64)IXGBE_READ_REG(hw, IXGBE_PFFLPL);
1382         pfflp |= (u64)IXGBE_READ_REG(hw, IXGBE_PFFLPH) << 32;
1383
1384         if (enable)
1385                 pfflp |= (1ULL << pool);
1386         else
1387                 pfflp &= ~(1ULL << pool);
1388
1389         IXGBE_WRITE_REG(hw, IXGBE_PFFLPL, (u32)pfflp);
1390         IXGBE_WRITE_REG(hw, IXGBE_PFFLPH, (u32)(pfflp >> 32));
1391 }
1392
1393 #define X550_COMMON_MAC \
1394         .init_hw                        = &ixgbe_init_hw_generic, \
1395         .start_hw                       = &ixgbe_start_hw_X540, \
1396         .clear_hw_cntrs                 = &ixgbe_clear_hw_cntrs_generic, \
1397         .enable_rx_dma                  = &ixgbe_enable_rx_dma_generic, \
1398         .get_mac_addr                   = &ixgbe_get_mac_addr_generic, \
1399         .get_device_caps                = &ixgbe_get_device_caps_generic, \
1400         .stop_adapter                   = &ixgbe_stop_adapter_generic, \
1401         .get_bus_info                   = &ixgbe_get_bus_info_generic, \
1402         .set_lan_id                     = &ixgbe_set_lan_id_multi_port_pcie, \
1403         .read_analog_reg8               = NULL, \
1404         .write_analog_reg8              = NULL, \
1405         .set_rxpba                      = &ixgbe_set_rxpba_generic, \
1406         .check_link                     = &ixgbe_check_mac_link_generic, \
1407         .led_on                         = &ixgbe_led_on_generic, \
1408         .led_off                        = &ixgbe_led_off_generic, \
1409         .blink_led_start                = &ixgbe_blink_led_start_X540, \
1410         .blink_led_stop                 = &ixgbe_blink_led_stop_X540, \
1411         .set_rar                        = &ixgbe_set_rar_generic, \
1412         .clear_rar                      = &ixgbe_clear_rar_generic, \
1413         .set_vmdq                       = &ixgbe_set_vmdq_generic, \
1414         .set_vmdq_san_mac               = &ixgbe_set_vmdq_san_mac_generic, \
1415         .clear_vmdq                     = &ixgbe_clear_vmdq_generic, \
1416         .init_rx_addrs                  = &ixgbe_init_rx_addrs_generic, \
1417         .update_mc_addr_list            = &ixgbe_update_mc_addr_list_generic, \
1418         .enable_mc                      = &ixgbe_enable_mc_generic, \
1419         .disable_mc                     = &ixgbe_disable_mc_generic, \
1420         .clear_vfta                     = &ixgbe_clear_vfta_generic, \
1421         .set_vfta                       = &ixgbe_set_vfta_generic, \
1422         .fc_enable                      = &ixgbe_fc_enable_generic, \
1423         .set_fw_drv_ver                 = &ixgbe_set_fw_drv_ver_generic, \
1424         .init_uta_tables                = &ixgbe_init_uta_tables_generic, \
1425         .set_mac_anti_spoofing          = &ixgbe_set_mac_anti_spoofing, \
1426         .set_vlan_anti_spoofing         = &ixgbe_set_vlan_anti_spoofing, \
1427         .set_source_address_pruning     = \
1428                                 &ixgbe_set_source_address_pruning_X550, \
1429         .set_ethertype_anti_spoofing    = \
1430                                 &ixgbe_set_ethertype_anti_spoofing_X550, \
1431         .acquire_swfw_sync              = &ixgbe_acquire_swfw_sync_X540, \
1432         .release_swfw_sync              = &ixgbe_release_swfw_sync_X540, \
1433         .disable_rx_buff                = &ixgbe_disable_rx_buff_generic, \
1434         .enable_rx_buff                 = &ixgbe_enable_rx_buff_generic, \
1435         .get_thermal_sensor_data        = NULL, \
1436         .init_thermal_sensor_thresh     = NULL, \
1437         .prot_autoc_read                = &prot_autoc_read_generic, \
1438         .prot_autoc_write               = &prot_autoc_write_generic, \
1439         .enable_rx                      = &ixgbe_enable_rx_generic, \
1440         .disable_rx                     = &ixgbe_disable_rx_x550, \
1441
1442 static struct ixgbe_mac_operations mac_ops_X550 = {
1443         X550_COMMON_MAC
1444         .reset_hw               = &ixgbe_reset_hw_X540,
1445         .get_media_type         = &ixgbe_get_media_type_X540,
1446         .get_san_mac_addr       = &ixgbe_get_san_mac_addr_generic,
1447         .get_wwn_prefix         = &ixgbe_get_wwn_prefix_generic,
1448         .setup_link             = &ixgbe_setup_mac_link_X540,
1449         .get_link_capabilities  = &ixgbe_get_copper_link_capabilities_generic,
1450         .setup_sfp              = NULL,
1451 };
1452
1453 static struct ixgbe_mac_operations mac_ops_X550EM_x = {
1454         X550_COMMON_MAC
1455         .reset_hw               = &ixgbe_reset_hw_X550em,
1456         .get_media_type         = &ixgbe_get_media_type_X550em,
1457         .get_san_mac_addr       = NULL,
1458         .get_wwn_prefix         = NULL,
1459         .setup_link             = NULL, /* defined later */
1460         .get_link_capabilities  = &ixgbe_get_link_capabilities_X550em,
1461         .setup_sfp              = ixgbe_setup_sfp_modules_X550em,
1462
1463 };
1464
1465 #define X550_COMMON_EEP \
1466         .read                   = &ixgbe_read_ee_hostif_X550, \
1467         .read_buffer            = &ixgbe_read_ee_hostif_buffer_X550, \
1468         .write                  = &ixgbe_write_ee_hostif_X550, \
1469         .write_buffer           = &ixgbe_write_ee_hostif_buffer_X550, \
1470         .validate_checksum      = &ixgbe_validate_eeprom_checksum_X550, \
1471         .update_checksum        = &ixgbe_update_eeprom_checksum_X550, \
1472         .calc_checksum          = &ixgbe_calc_eeprom_checksum_X550, \
1473
1474 static struct ixgbe_eeprom_operations eeprom_ops_X550 = {
1475         X550_COMMON_EEP
1476         .init_params            = &ixgbe_init_eeprom_params_X550,
1477 };
1478
1479 static struct ixgbe_eeprom_operations eeprom_ops_X550EM_x = {
1480         X550_COMMON_EEP
1481         .init_params            = &ixgbe_init_eeprom_params_X540,
1482 };
1483
1484 #define X550_COMMON_PHY \
1485         .identify_sfp           = &ixgbe_identify_module_generic, \
1486         .reset                  = NULL, \
1487         .setup_link_speed       = &ixgbe_setup_phy_link_speed_generic, \
1488         .read_i2c_byte          = &ixgbe_read_i2c_byte_generic, \
1489         .write_i2c_byte         = &ixgbe_write_i2c_byte_generic, \
1490         .read_i2c_sff8472       = &ixgbe_read_i2c_sff8472_generic, \
1491         .read_i2c_eeprom        = &ixgbe_read_i2c_eeprom_generic, \
1492         .write_i2c_eeprom       = &ixgbe_write_i2c_eeprom_generic, \
1493         .check_overtemp         = &ixgbe_tn_check_overtemp, \
1494         .get_firmware_version   = &ixgbe_get_phy_firmware_version_generic,
1495
1496 static struct ixgbe_phy_operations phy_ops_X550 = {
1497         X550_COMMON_PHY
1498         .init                   = NULL,
1499         .identify               = &ixgbe_identify_phy_generic,
1500         .read_reg               = &ixgbe_read_phy_reg_generic,
1501         .write_reg              = &ixgbe_write_phy_reg_generic,
1502         .setup_link             = &ixgbe_setup_phy_link_generic,
1503         .read_i2c_combined      = &ixgbe_read_i2c_combined_generic,
1504         .write_i2c_combined     = &ixgbe_write_i2c_combined_generic,
1505 };
1506
1507 static struct ixgbe_phy_operations phy_ops_X550EM_x = {
1508         X550_COMMON_PHY
1509         .init                   = &ixgbe_init_phy_ops_X550em,
1510         .identify               = &ixgbe_identify_phy_x550em,
1511         .read_reg               = NULL, /* defined later */
1512         .write_reg              = NULL, /* defined later */
1513         .setup_link             = NULL, /* defined later */
1514 };
1515
1516 struct ixgbe_info ixgbe_X550_info = {
1517         .mac                    = ixgbe_mac_X550,
1518         .get_invariants         = &ixgbe_get_invariants_X540,
1519         .mac_ops                = &mac_ops_X550,
1520         .eeprom_ops             = &eeprom_ops_X550,
1521         .phy_ops                = &phy_ops_X550,
1522         .mbx_ops                = &mbx_ops_generic,
1523 };
1524
1525 struct ixgbe_info ixgbe_X550EM_x_info = {
1526         .mac                    = ixgbe_mac_X550EM_x,
1527         .get_invariants         = &ixgbe_get_invariants_X540,
1528         .mac_ops                = &mac_ops_X550EM_x,
1529         .eeprom_ops             = &eeprom_ops_X550EM_x,
1530         .phy_ops                = &phy_ops_X550EM_x,
1531         .mbx_ops                = &mbx_ops_generic,
1532 };