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 **/
45u8 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 **/
71s32 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 **/
112bool 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 **/
130bool 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 **/
192s32 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 **/
226s32 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 **/
299s32 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 **/
344bool 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 **/
395s32 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 **/
469s32 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