xref: /freebsd/sys/dev/e1000/e1000_ich8lan.h (revision 7d9119bd)
18cfa0ad2SJack F Vogel /******************************************************************************
28cfa0ad2SJack F Vogel 
3a69ed8dfSJack F Vogel   Copyright (c) 2001-2010, Intel Corporation
48cfa0ad2SJack F Vogel   All rights reserved.
58cfa0ad2SJack F Vogel 
68cfa0ad2SJack F Vogel   Redistribution and use in source and binary forms, with or without
78cfa0ad2SJack F Vogel   modification, are permitted provided that the following conditions are met:
88cfa0ad2SJack F Vogel 
98cfa0ad2SJack F Vogel    1. Redistributions of source code must retain the above copyright notice,
108cfa0ad2SJack F Vogel       this list of conditions and the following disclaimer.
118cfa0ad2SJack F Vogel 
128cfa0ad2SJack F Vogel    2. Redistributions in binary form must reproduce the above copyright
138cfa0ad2SJack F Vogel       notice, this list of conditions and the following disclaimer in the
148cfa0ad2SJack F Vogel       documentation and/or other materials provided with the distribution.
158cfa0ad2SJack F Vogel 
168cfa0ad2SJack F Vogel    3. Neither the name of the Intel Corporation nor the names of its
178cfa0ad2SJack F Vogel       contributors may be used to endorse or promote products derived from
188cfa0ad2SJack F Vogel       this software without specific prior written permission.
198cfa0ad2SJack F Vogel 
208cfa0ad2SJack F Vogel   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
218cfa0ad2SJack F Vogel   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
228cfa0ad2SJack F Vogel   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
238cfa0ad2SJack F Vogel   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
248cfa0ad2SJack F Vogel   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
258cfa0ad2SJack F Vogel   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
268cfa0ad2SJack F Vogel   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
278cfa0ad2SJack F Vogel   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
288cfa0ad2SJack F Vogel   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
298cfa0ad2SJack F Vogel   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
308cfa0ad2SJack F Vogel   POSSIBILITY OF SUCH DAMAGE.
318cfa0ad2SJack F Vogel 
328cfa0ad2SJack F Vogel ******************************************************************************/
338cfa0ad2SJack F Vogel /*$FreeBSD$*/
348cfa0ad2SJack F Vogel 
358cfa0ad2SJack F Vogel #ifndef _E1000_ICH8LAN_H_
368cfa0ad2SJack F Vogel #define _E1000_ICH8LAN_H_
378cfa0ad2SJack F Vogel 
388cfa0ad2SJack F Vogel #define ICH_FLASH_GFPREG                 0x0000
398cfa0ad2SJack F Vogel #define ICH_FLASH_HSFSTS                 0x0004
408cfa0ad2SJack F Vogel #define ICH_FLASH_HSFCTL                 0x0006
418cfa0ad2SJack F Vogel #define ICH_FLASH_FADDR                  0x0008
428cfa0ad2SJack F Vogel #define ICH_FLASH_FDATA0                 0x0010
438cfa0ad2SJack F Vogel 
44d035aa2dSJack F Vogel /* Requires up to 10 seconds when MNG might be accessing part. */
45d035aa2dSJack F Vogel #define ICH_FLASH_READ_COMMAND_TIMEOUT   10000000
46d035aa2dSJack F Vogel #define ICH_FLASH_WRITE_COMMAND_TIMEOUT  10000000
47d035aa2dSJack F Vogel #define ICH_FLASH_ERASE_COMMAND_TIMEOUT  10000000
488cfa0ad2SJack F Vogel #define ICH_FLASH_LINEAR_ADDR_MASK       0x00FFFFFF
498cfa0ad2SJack F Vogel #define ICH_FLASH_CYCLE_REPEAT_COUNT     10
508cfa0ad2SJack F Vogel 
518cfa0ad2SJack F Vogel #define ICH_CYCLE_READ                   0
528cfa0ad2SJack F Vogel #define ICH_CYCLE_WRITE                  2
538cfa0ad2SJack F Vogel #define ICH_CYCLE_ERASE                  3
548cfa0ad2SJack F Vogel 
558cfa0ad2SJack F Vogel #define FLASH_GFPREG_BASE_MASK           0x1FFF
568cfa0ad2SJack F Vogel #define FLASH_SECTOR_ADDR_SHIFT          12
578cfa0ad2SJack F Vogel 
588cfa0ad2SJack F Vogel #define ICH_FLASH_SEG_SIZE_256           256
598cfa0ad2SJack F Vogel #define ICH_FLASH_SEG_SIZE_4K            4096
608cfa0ad2SJack F Vogel #define ICH_FLASH_SEG_SIZE_8K            8192
618cfa0ad2SJack F Vogel #define ICH_FLASH_SEG_SIZE_64K           65536
628cfa0ad2SJack F Vogel #define ICH_FLASH_SECTOR_SIZE            4096
638cfa0ad2SJack F Vogel 
648cfa0ad2SJack F Vogel #define ICH_FLASH_REG_MAPSIZE            0x00A0
658cfa0ad2SJack F Vogel 
668cfa0ad2SJack F Vogel #define E1000_ICH_FWSM_RSPCIPHY          0x00000040 /* Reset PHY on PCI Reset */
678cfa0ad2SJack F Vogel #define E1000_ICH_FWSM_DISSW             0x10000000 /* FW Disables SW Writes */
688cfa0ad2SJack F Vogel /* FW established a valid mode */
698cfa0ad2SJack F Vogel #define E1000_ICH_FWSM_FW_VALID          0x00008000
708cfa0ad2SJack F Vogel 
718cfa0ad2SJack F Vogel #define E1000_ICH_MNG_IAMT_MODE          0x2
728cfa0ad2SJack F Vogel 
737d9119bdSJack F Vogel #define E1000_FWSM_PROXY_MODE            0x00000008 /* FW is in proxy mode */
747d9119bdSJack F Vogel 
757d9119bdSJack F Vogel /* Shared Receive Address Registers */
767d9119bdSJack F Vogel #define E1000_SHRAL(_i)  (0x05438 + ((_i) * 8))
777d9119bdSJack F Vogel #define E1000_SHRAH(_i)  (0x0543C + ((_i) * 8))
787d9119bdSJack F Vogel #define E1000_SHRAH_AV   0x80000000 /* Addr Valid bit */
797d9119bdSJack F Vogel #define E1000_SHRAH_MAV  0x40000000 /* Multicast Addr Valid bit */
807d9119bdSJack F Vogel 
817d9119bdSJack F Vogel #define E1000_H2ME             0x05B50    /* Host to ME */
827d9119bdSJack F Vogel #define E1000_H2ME_LSECREQ     0x00000001 /* Linksec Request */
837d9119bdSJack F Vogel #define E1000_H2ME_LSECA       0x00000002 /* Linksec Active */
847d9119bdSJack F Vogel #define E1000_H2ME_LSECSF      0x00000004 /* Linksec Failed */
857d9119bdSJack F Vogel #define E1000_H2ME_LSECD       0x00000008 /* Linksec Disabled */
867d9119bdSJack F Vogel #define E1000_H2ME_SLCAPD      0x00000010 /* Start LCAPD */
877d9119bdSJack F Vogel #define E1000_H2ME_IPV4_ARP_EN 0x00000020 /* Arp Offload enable bit */
887d9119bdSJack F Vogel #define E1000_H2ME_IPV6_NS_EN  0x00000040 /* NS Offload enable bit */
897d9119bdSJack F Vogel 
908cfa0ad2SJack F Vogel #define ID_LED_DEFAULT_ICH8LAN  ((ID_LED_DEF1_DEF2 << 12) | \
91d035aa2dSJack F Vogel                                  (ID_LED_OFF1_OFF2 <<  8) | \
92d035aa2dSJack F Vogel                                  (ID_LED_OFF1_ON2  <<  4) | \
938cfa0ad2SJack F Vogel                                  (ID_LED_DEF1_DEF2))
948cfa0ad2SJack F Vogel 
958cfa0ad2SJack F Vogel #define E1000_ICH_NVM_SIG_WORD           0x13
968cfa0ad2SJack F Vogel #define E1000_ICH_NVM_SIG_MASK           0xC000
97d035aa2dSJack F Vogel #define E1000_ICH_NVM_VALID_SIG_MASK     0xC0
98d035aa2dSJack F Vogel #define E1000_ICH_NVM_SIG_VALUE          0x80
998cfa0ad2SJack F Vogel 
1008cfa0ad2SJack F Vogel #define E1000_ICH8_LAN_INIT_TIMEOUT      1500
1018cfa0ad2SJack F Vogel 
1028cfa0ad2SJack F Vogel #define E1000_FEXTNVM_SW_CONFIG        1
1038cfa0ad2SJack F Vogel #define E1000_FEXTNVM_SW_CONFIG_ICH8M (1 << 27) /* Bit redefined for ICH8M */
1048cfa0ad2SJack F Vogel 
1057d9119bdSJack F Vogel #define E1000_FEXTNVM4_BEACON_DURATION_MASK    0x7
1067d9119bdSJack F Vogel #define E1000_FEXTNVM4_BEACON_DURATION_8USEC   0x7
1077d9119bdSJack F Vogel #define E1000_FEXTNVM4_BEACON_DURATION_16USEC  0x3
1087d9119bdSJack F Vogel 
1098cfa0ad2SJack F Vogel #define PCIE_ICH8_SNOOP_ALL   PCIE_NO_SNOOP_ALL
1108cfa0ad2SJack F Vogel 
1118cfa0ad2SJack F Vogel #define E1000_ICH_RAR_ENTRIES            7
1127d9119bdSJack F Vogel #define E1000_PCH2_RAR_ENTRIES           5 /* RAR[0], SHRA[0-3] */
1138cfa0ad2SJack F Vogel 
1148cfa0ad2SJack F Vogel #define PHY_PAGE_SHIFT 5
1158cfa0ad2SJack F Vogel #define PHY_REG(page, reg) (((page) << PHY_PAGE_SHIFT) | \
1168cfa0ad2SJack F Vogel                            ((reg) & MAX_PHY_REG_ADDRESS))
1178cfa0ad2SJack F Vogel #define IGP3_KMRN_DIAG  PHY_REG(770, 19) /* KMRN Diagnostic */
1188cfa0ad2SJack F Vogel #define IGP3_VR_CTRL    PHY_REG(776, 18) /* Voltage Regulator Control */
1198cfa0ad2SJack F Vogel #define IGP3_CAPABILITY PHY_REG(776, 19) /* Capability */
1208cfa0ad2SJack F Vogel #define IGP3_PM_CTRL    PHY_REG(769, 20) /* Power Management Control */
1218cfa0ad2SJack F Vogel 
1228cfa0ad2SJack F Vogel #define IGP3_KMRN_DIAG_PCS_LOCK_LOSS         0x0002
1238cfa0ad2SJack F Vogel #define IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK 0x0300
1248cfa0ad2SJack F Vogel #define IGP3_VR_CTRL_MODE_SHUTDOWN           0x0200
1258cfa0ad2SJack F Vogel #define IGP3_PM_CTRL_FORCE_PWR_DOWN          0x0020
1268cfa0ad2SJack F Vogel 
127d035aa2dSJack F Vogel /* PHY Wakeup Registers and defines */
128d035aa2dSJack F Vogel #define BM_RCTL         PHY_REG(BM_WUC_PAGE, 0)
129d035aa2dSJack F Vogel #define BM_WUC          PHY_REG(BM_WUC_PAGE, 1)
130d035aa2dSJack F Vogel #define BM_WUFC         PHY_REG(BM_WUC_PAGE, 2)
131d035aa2dSJack F Vogel #define BM_WUS          PHY_REG(BM_WUC_PAGE, 3)
132d035aa2dSJack F Vogel #define BM_RAR_L(_i)    (BM_PHY_REG(BM_WUC_PAGE, 16 + ((_i) << 2)))
133d035aa2dSJack F Vogel #define BM_RAR_M(_i)    (BM_PHY_REG(BM_WUC_PAGE, 17 + ((_i) << 2)))
134d035aa2dSJack F Vogel #define BM_RAR_H(_i)    (BM_PHY_REG(BM_WUC_PAGE, 18 + ((_i) << 2)))
135d035aa2dSJack F Vogel #define BM_RAR_CTRL(_i) (BM_PHY_REG(BM_WUC_PAGE, 19 + ((_i) << 2)))
136d035aa2dSJack F Vogel #define BM_MTA(_i)      (BM_PHY_REG(BM_WUC_PAGE, 128 + ((_i) << 1)))
1377d9119bdSJack F Vogel #define BM_IPAV         (BM_PHY_REG(BM_WUC_PAGE, 64))
1387d9119bdSJack F Vogel #define BM_IP4AT_L(_i)  (BM_PHY_REG(BM_WUC_PAGE, 82 + ((_i) * 2)))
1397d9119bdSJack F Vogel #define BM_IP4AT_H(_i)  (BM_PHY_REG(BM_WUC_PAGE, 83 + ((_i) * 2)))
1407d9119bdSJack F Vogel 
1417d9119bdSJack F Vogel #define BM_SHRAL_LOWER(_i) (BM_PHY_REG(BM_WUC_PAGE, 44 + ((_i) * 4)))
1427d9119bdSJack F Vogel #define BM_SHRAL_UPPER(_i) (BM_PHY_REG(BM_WUC_PAGE, 45 + ((_i) * 4)))
1437d9119bdSJack F Vogel #define BM_SHRAH_LOWER(_i) (BM_PHY_REG(BM_WUC_PAGE, 46 + ((_i) * 4)))
1447d9119bdSJack F Vogel #define BM_SHRAH_UPPER(_i) (BM_PHY_REG(BM_WUC_PAGE, 47 + ((_i) * 4)))
145d035aa2dSJack F Vogel 
146d035aa2dSJack F Vogel #define BM_RCTL_UPE           0x0001          /* Unicast Promiscuous Mode */
147d035aa2dSJack F Vogel #define BM_RCTL_MPE           0x0002          /* Multicast Promiscuous Mode */
148d035aa2dSJack F Vogel #define BM_RCTL_MO_SHIFT      3               /* Multicast Offset Shift */
149d035aa2dSJack F Vogel #define BM_RCTL_MO_MASK       (3 << 3)        /* Multicast Offset Mask */
150d035aa2dSJack F Vogel #define BM_RCTL_BAM           0x0020          /* Broadcast Accept Mode */
151d035aa2dSJack F Vogel #define BM_RCTL_PMCF          0x0040          /* Pass MAC Control Frames */
152d035aa2dSJack F Vogel #define BM_RCTL_RFCE          0x0080          /* Rx Flow Control Enable */
153d035aa2dSJack F Vogel 
1549d81738fSJack F Vogel #define HV_LED_CONFIG		PHY_REG(768, 30) /* LED Configuration */
1559d81738fSJack F Vogel #define HV_MUX_DATA_CTRL               PHY_REG(776, 16)
1569d81738fSJack F Vogel #define HV_MUX_DATA_CTRL_GEN_TO_MAC    0x0400
1579d81738fSJack F Vogel #define HV_MUX_DATA_CTRL_FORCE_SPEED   0x0004
1589d81738fSJack F Vogel #define HV_SCC_UPPER		PHY_REG(778, 16) /* Single Collision Count */
1599d81738fSJack F Vogel #define HV_SCC_LOWER		PHY_REG(778, 17)
1609d81738fSJack F Vogel #define HV_ECOL_UPPER		PHY_REG(778, 18) /* Excessive Collision Count */
1619d81738fSJack F Vogel #define HV_ECOL_LOWER		PHY_REG(778, 19)
1629d81738fSJack F Vogel #define HV_MCC_UPPER		PHY_REG(778, 20) /* Multiple Collision Count */
1639d81738fSJack F Vogel #define HV_MCC_LOWER		PHY_REG(778, 21)
1649d81738fSJack F Vogel #define HV_LATECOL_UPPER	PHY_REG(778, 23) /* Late Collision Count */
1659d81738fSJack F Vogel #define HV_LATECOL_LOWER	PHY_REG(778, 24)
1669d81738fSJack F Vogel #define HV_COLC_UPPER		PHY_REG(778, 25) /* Collision Count */
1679d81738fSJack F Vogel #define HV_COLC_LOWER		PHY_REG(778, 26)
1689d81738fSJack F Vogel #define HV_DC_UPPER		PHY_REG(778, 27) /* Defer Count */
1699d81738fSJack F Vogel #define HV_DC_LOWER		PHY_REG(778, 28)
1709d81738fSJack F Vogel #define HV_TNCRS_UPPER		PHY_REG(778, 29) /* Transmit with no CRS */
1719d81738fSJack F Vogel #define HV_TNCRS_LOWER		PHY_REG(778, 30)
1729d81738fSJack F Vogel 
1734edd8523SJack F Vogel #define E1000_FCRTV_PCH     0x05F40 /* PCH Flow Control Refresh Timer Value */
1744edd8523SJack F Vogel 
1754edd8523SJack F Vogel #define E1000_NVM_K1_CONFIG 0x1B /* NVM K1 Config Word */
1764edd8523SJack F Vogel #define E1000_NVM_K1_ENABLE 0x1  /* NVM Enable K1 bit */
1774edd8523SJack F Vogel 
1784edd8523SJack F Vogel /* SMBus Address Phy Register */
1794edd8523SJack F Vogel #define HV_SMB_ADDR            PHY_REG(768, 26)
1807d9119bdSJack F Vogel #define HV_SMB_ADDR_MASK       0x007F
1814edd8523SJack F Vogel #define HV_SMB_ADDR_PEC_EN     0x0200
1824edd8523SJack F Vogel #define HV_SMB_ADDR_VALID      0x0080
1834edd8523SJack F Vogel 
1844edd8523SJack F Vogel /* Strapping Option Register - RO */
1854edd8523SJack F Vogel #define E1000_STRAP                     0x0000C
1864edd8523SJack F Vogel #define E1000_STRAP_SMBUS_ADDRESS_MASK  0x00FE0000
1874edd8523SJack F Vogel #define E1000_STRAP_SMBUS_ADDRESS_SHIFT 17
1884edd8523SJack F Vogel 
1894edd8523SJack F Vogel /* OEM Bits Phy Register */
1904edd8523SJack F Vogel #define HV_OEM_BITS            PHY_REG(768, 25)
1914edd8523SJack F Vogel #define HV_OEM_BITS_LPLU       0x0004 /* Low Power Link Up */
1924edd8523SJack F Vogel #define HV_OEM_BITS_GBE_DIS    0x0040 /* Gigabit Disable */
1934edd8523SJack F Vogel #define HV_OEM_BITS_RESTART_AN 0x0400 /* Restart Auto-negotiation */
1944edd8523SJack F Vogel 
1954edd8523SJack F Vogel #define LCD_CFG_PHY_ADDR_BIT   0x0020 /* Phy address bit from LCD Config word */
1964edd8523SJack F Vogel 
197a69ed8dfSJack F Vogel /* KMRN Mode Control */
198a69ed8dfSJack F Vogel #define HV_KMRN_MODE_CTRL	PHY_REG(769, 16)
199a69ed8dfSJack F Vogel #define HV_KMRN_MDIO_SLOW	0x0400
200a69ed8dfSJack F Vogel 
2018ec87fc5SJack F Vogel /* PHY Power Management Control */
2028ec87fc5SJack F Vogel #define HV_PM_CTRL		PHY_REG(770, 17)
2038ec87fc5SJack F Vogel 
2044edd8523SJack F Vogel #define SW_FLAG_TIMEOUT    1000 /* SW Semaphore flag timeout in milliseconds */
2054edd8523SJack F Vogel 
2067d9119bdSJack F Vogel /* PHY Low Power Idle Control */
2077d9119bdSJack F Vogel #define I82579_LPI_CTRL			PHY_REG(772, 20)
2087d9119bdSJack F Vogel #define I82579_LPI_CTRL_ENABLE_MASK	0x6000
2097d9119bdSJack F Vogel 
2108cfa0ad2SJack F Vogel /*
2118cfa0ad2SJack F Vogel  * Additional interrupts need to be handled for ICH family:
2128cfa0ad2SJack F Vogel  *  DSW = The FW changed the status of the DISSW bit in FWSM
2138cfa0ad2SJack F Vogel  *  PHYINT = The LAN connected device generates an interrupt
2148cfa0ad2SJack F Vogel  *  EPRST = Manageability reset event
2158cfa0ad2SJack F Vogel  */
2168cfa0ad2SJack F Vogel #define IMS_ICH_ENABLE_MASK (\
2178cfa0ad2SJack F Vogel     E1000_IMS_DSW   | \
2188cfa0ad2SJack F Vogel     E1000_IMS_PHYINT | \
2198cfa0ad2SJack F Vogel     E1000_IMS_EPRST)
2208cfa0ad2SJack F Vogel 
2218cfa0ad2SJack F Vogel /* Additional interrupt register bit definitions */
2228cfa0ad2SJack F Vogel #define E1000_ICR_LSECPNC       0x00004000          /* PN threshold - client */
2238cfa0ad2SJack F Vogel #define E1000_IMS_LSECPNC       E1000_ICR_LSECPNC   /* PN threshold - client */
2248cfa0ad2SJack F Vogel #define E1000_ICS_LSECPNC       E1000_ICR_LSECPNC   /* PN threshold - client */
2258cfa0ad2SJack F Vogel 
2268cfa0ad2SJack F Vogel /* Security Processing bit Indication */
2278cfa0ad2SJack F Vogel #define E1000_RXDEXT_LINKSEC_STATUS_LSECH       0x01000000
2288cfa0ad2SJack F Vogel #define E1000_RXDEXT_LINKSEC_ERROR_BIT_MASK     0x60000000
2298cfa0ad2SJack F Vogel #define E1000_RXDEXT_LINKSEC_ERROR_NO_SA_MATCH  0x20000000
2308cfa0ad2SJack F Vogel #define E1000_RXDEXT_LINKSEC_ERROR_REPLAY_ERROR 0x40000000
2318cfa0ad2SJack F Vogel #define E1000_RXDEXT_LINKSEC_ERROR_BAD_SIG      0x60000000
2328cfa0ad2SJack F Vogel 
2337d9119bdSJack F Vogel /* Receive Address Initial CRC Calculation */
2347d9119bdSJack F Vogel #define E1000_PCH_RAICC(_n)	(0x05F50 + ((_n) * 4))
2357d9119bdSJack F Vogel 
2368cfa0ad2SJack F Vogel void e1000_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw,
2378cfa0ad2SJack F Vogel                                                  bool state);
2388cfa0ad2SJack F Vogel void e1000_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw);
2398cfa0ad2SJack F Vogel void e1000_gig_downshift_workaround_ich8lan(struct e1000_hw *hw);
2408cfa0ad2SJack F Vogel void e1000_disable_gig_wol_ich8lan(struct e1000_hw *hw);
2414edd8523SJack F Vogel s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable);
2424edd8523SJack F Vogel s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_config);
243d035aa2dSJack F Vogel s32 e1000_hv_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw);
2447d9119bdSJack F Vogel void e1000_copy_rx_addrs_to_phy_ich8lan(struct e1000_hw *hw);
2457d9119bdSJack F Vogel s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable);
2468cfa0ad2SJack F Vogel #endif
247