xref: /freebsd-src/sys/dev/e1000/e1000_osdep.c (revision 930a1e6f3d2dd629774f1b48b1acf7ba482ab659)
18cfa0ad2SJack F Vogel /******************************************************************************
27282444bSPedro F. Giffuni   SPDX-License-Identifier: BSD-3-Clause
38cfa0ad2SJack F Vogel 
4702cac6cSKevin Bowling   Copyright (c) 2001-2020, Intel Corporation
58cfa0ad2SJack F Vogel   All rights reserved.
68cfa0ad2SJack F Vogel 
78cfa0ad2SJack F Vogel   Redistribution and use in source and binary forms, with or without
88cfa0ad2SJack F Vogel   modification, are permitted provided that the following conditions are met:
98cfa0ad2SJack F Vogel 
108cfa0ad2SJack F Vogel    1. Redistributions of source code must retain the above copyright notice,
118cfa0ad2SJack F Vogel       this list of conditions and the following disclaimer.
128cfa0ad2SJack F Vogel 
138cfa0ad2SJack F Vogel    2. Redistributions in binary form must reproduce the above copyright
148cfa0ad2SJack F Vogel       notice, this list of conditions and the following disclaimer in the
158cfa0ad2SJack F Vogel       documentation and/or other materials provided with the distribution.
168cfa0ad2SJack F Vogel 
178cfa0ad2SJack F Vogel    3. Neither the name of the Intel Corporation nor the names of its
188cfa0ad2SJack F Vogel       contributors may be used to endorse or promote products derived from
198cfa0ad2SJack F Vogel       this software without specific prior written permission.
208cfa0ad2SJack F Vogel 
218cfa0ad2SJack F Vogel   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
228cfa0ad2SJack F Vogel   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
238cfa0ad2SJack F Vogel   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
248cfa0ad2SJack F Vogel   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
258cfa0ad2SJack F Vogel   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
268cfa0ad2SJack F Vogel   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
278cfa0ad2SJack F Vogel   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
288cfa0ad2SJack F Vogel   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
298cfa0ad2SJack F Vogel   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
308cfa0ad2SJack F Vogel   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
318cfa0ad2SJack F Vogel   POSSIBILITY OF SUCH DAMAGE.
328cfa0ad2SJack F Vogel 
338cfa0ad2SJack F Vogel ******************************************************************************/
348cfa0ad2SJack F Vogel 
358cfa0ad2SJack F Vogel #include "e1000_api.h"
368cfa0ad2SJack F Vogel 
37*930a1e6fSJoyu Liao int e1000_use_pause_delay = 0;
38*930a1e6fSJoyu Liao 
39*930a1e6fSJoyu Liao static void
40*930a1e6fSJoyu Liao e1000_enable_pause_delay(void *use_pause_delay)
41*930a1e6fSJoyu Liao {
42*930a1e6fSJoyu Liao 	*((int *)use_pause_delay) = 1;
43*930a1e6fSJoyu Liao }
44*930a1e6fSJoyu Liao 
45*930a1e6fSJoyu Liao SYSINIT(enable_pause_delay, SI_SUB_CLOCKS, SI_ORDER_ANY, e1000_enable_pause_delay, &e1000_use_pause_delay);
46*930a1e6fSJoyu Liao 
478cfa0ad2SJack F Vogel /*
488cfa0ad2SJack F Vogel  * NOTE: the following routines using the e1000
498cfa0ad2SJack F Vogel  * 	naming style are provided to the shared
508cfa0ad2SJack F Vogel  *	code but are OS specific
518cfa0ad2SJack F Vogel  */
528cfa0ad2SJack F Vogel 
538cfa0ad2SJack F Vogel void
549d81738fSJack F Vogel e1000_write_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value)
558cfa0ad2SJack F Vogel {
568cfa0ad2SJack F Vogel 	pci_write_config(((struct e1000_osdep *)hw->back)->dev, reg, *value, 2);
578cfa0ad2SJack F Vogel }
588cfa0ad2SJack F Vogel 
598cfa0ad2SJack F Vogel void
609d81738fSJack F Vogel e1000_read_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value)
618cfa0ad2SJack F Vogel {
628cfa0ad2SJack F Vogel 	*value = pci_read_config(((struct e1000_osdep *)hw->back)->dev, reg, 2);
638cfa0ad2SJack F Vogel }
648cfa0ad2SJack F Vogel 
658cfa0ad2SJack F Vogel void
668cfa0ad2SJack F Vogel e1000_pci_set_mwi(struct e1000_hw *hw)
678cfa0ad2SJack F Vogel {
688cfa0ad2SJack F Vogel 	pci_write_config(((struct e1000_osdep *)hw->back)->dev, PCIR_COMMAND,
698cfa0ad2SJack F Vogel 	    (hw->bus.pci_cmd_word | CMD_MEM_WRT_INVALIDATE), 2);
708cfa0ad2SJack F Vogel }
718cfa0ad2SJack F Vogel 
728cfa0ad2SJack F Vogel void
738cfa0ad2SJack F Vogel e1000_pci_clear_mwi(struct e1000_hw *hw)
748cfa0ad2SJack F Vogel {
758cfa0ad2SJack F Vogel 	pci_write_config(((struct e1000_osdep *)hw->back)->dev, PCIR_COMMAND,
768cfa0ad2SJack F Vogel 	    (hw->bus.pci_cmd_word & ~CMD_MEM_WRT_INVALIDATE), 2);
778cfa0ad2SJack F Vogel }
788cfa0ad2SJack F Vogel 
798cfa0ad2SJack F Vogel /*
808cfa0ad2SJack F Vogel  * Read the PCI Express capabilities
818cfa0ad2SJack F Vogel  */
828cfa0ad2SJack F Vogel int32_t
839d81738fSJack F Vogel e1000_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value)
848cfa0ad2SJack F Vogel {
859d81738fSJack F Vogel 	device_t dev = ((struct e1000_osdep *)hw->back)->dev;
869d81738fSJack F Vogel 	u32	offset;
878cfa0ad2SJack F Vogel 
883b0a4aefSJohn Baldwin 	pci_find_cap(dev, PCIY_EXPRESS, &offset);
899d81738fSJack F Vogel 	*value = pci_read_config(dev, offset + reg, 2);
909d81738fSJack F Vogel 	return (E1000_SUCCESS);
919d81738fSJack F Vogel }
929d81738fSJack F Vogel 
939d81738fSJack F Vogel /*
949d81738fSJack F Vogel  * Write the PCI Express capabilities
959d81738fSJack F Vogel  */
969d81738fSJack F Vogel int32_t
979d81738fSJack F Vogel e1000_write_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value)
989d81738fSJack F Vogel {
999d81738fSJack F Vogel 	device_t dev = ((struct e1000_osdep *)hw->back)->dev;
1009d81738fSJack F Vogel 	u32	offset;
1019d81738fSJack F Vogel 
1023b0a4aefSJohn Baldwin 	pci_find_cap(dev, PCIY_EXPRESS, &offset);
1039d81738fSJack F Vogel 	pci_write_config(dev, offset + reg, *value, 2);
1048cfa0ad2SJack F Vogel 	return (E1000_SUCCESS);
1058cfa0ad2SJack F Vogel }
106