layerscape: update linux 4.9 patches to LSDK-18.06
[openwrt/staging/stintel.git] / target / linux / layerscape / patches-4.9 / 701-sdk_dpaa-support-layerscape.patch
index c318c579b0e0cddff1bee1db0cbd8dda39b0a1d1..0ea829aef26f7a3bbf4856a24da3231f2d245901 100644 (file)
@@ -1,7 +1,7 @@
-From 2f887ade916e7e1de2f8a84d3902aaa30af4b163 Mon Sep 17 00:00:00 2001
+From 6cc4cbfd0456c752f9f59d7d07fbb4b514dc6909 Mon Sep 17 00:00:00 2001
 From: Yangbo Lu <yangbo.lu@nxp.com>
-Date: Wed, 17 Jan 2018 14:59:15 +0800
-Subject: [PATCH 07/30] sdk_dpaa: support layerscape
+Date: Thu, 5 Jul 2018 16:25:00 +0800
+Subject: [PATCH 07/32] sdk_dpaa: support layerscape
 
 This is an integrated patch for layerscape dpaa1-sdk support.
 
@@ -12,264 +12,264 @@ Signed-off-by: Madalin Bucur <madalin.bucur@nxp.com>
 Signed-off-by: Mathew McBride <matt@traverse.com.au>
 Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 ---
drivers/net/ethernet/freescale/sdk_dpaa/Kconfig    |  196 +
drivers/net/ethernet/freescale/sdk_dpaa/Makefile   |   46 +
- .../net/ethernet/freescale/sdk_dpaa/dpaa_1588.c    |  580 ++
- .../net/ethernet/freescale/sdk_dpaa/dpaa_1588.h    |  138 +
- .../net/ethernet/freescale/sdk_dpaa/dpaa_debugfs.c |  180 +
- .../net/ethernet/freescale/sdk_dpaa/dpaa_debugfs.h |   43 +
drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c | 1224 ++++
drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.h |  687 ++
- .../ethernet/freescale/sdk_dpaa/dpaa_eth_base.c    |  205 +
- .../ethernet/freescale/sdk_dpaa/dpaa_eth_base.h    |   49 +
- .../ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.c   | 2013 ++++++
- .../ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.h   |  238 +
- .../ethernet/freescale/sdk_dpaa/dpaa_eth_common.c  | 1802 +++++
- .../ethernet/freescale/sdk_dpaa/dpaa_eth_common.h  |  225 +
- .../ethernet/freescale/sdk_dpaa/dpaa_eth_proxy.c   |  381 +
- .../net/ethernet/freescale/sdk_dpaa/dpaa_eth_sg.c  | 1168 +++
- .../ethernet/freescale/sdk_dpaa/dpaa_eth_sysfs.c   |  278 +
- .../ethernet/freescale/sdk_dpaa/dpaa_eth_trace.h   |  144 +
- .../net/ethernet/freescale/sdk_dpaa/dpaa_ethtool.c |  544 ++
drivers/net/ethernet/freescale/sdk_dpaa/dpaa_ptp.c |  291 +
drivers/net/ethernet/freescale/sdk_dpaa/mac-api.c  |  907 +++
- drivers/net/ethernet/freescale/sdk_dpaa/mac.c      |  489 ++
- drivers/net/ethernet/freescale/sdk_dpaa/mac.h      |  135 +
- .../net/ethernet/freescale/sdk_dpaa/offline_port.c |  848 +++
- .../net/ethernet/freescale/sdk_dpaa/offline_port.h |   59 +
drivers/net/ethernet/freescale/sdk_fman/Kconfig    |  153 +
drivers/net/ethernet/freescale/sdk_fman/Makefile   |   11 +
- .../freescale/sdk_fman/Peripherals/FM/HC/Makefile  |   15 +
- .../freescale/sdk_fman/Peripherals/FM/HC/hc.c      | 1232 ++++
- .../freescale/sdk_fman/Peripherals/FM/MAC/Makefile |   28 +
- .../freescale/sdk_fman/Peripherals/FM/MAC/dtsec.c  | 1465 ++++
- .../freescale/sdk_fman/Peripherals/FM/MAC/dtsec.h  |  228 +
- .../sdk_fman/Peripherals/FM/MAC/dtsec_mii_acc.c    |   97 +
- .../sdk_fman/Peripherals/FM/MAC/dtsec_mii_acc.h    |   42 +
- .../freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.c |  674 ++
- .../freescale/sdk_fman/Peripherals/FM/MAC/fm_mac.h |  226 +
- .../sdk_fman/Peripherals/FM/MAC/fman_crc32.c       |  119 +
- .../sdk_fman/Peripherals/FM/MAC/fman_crc32.h       |   43 +
- .../sdk_fman/Peripherals/FM/MAC/fman_dtsec.c       |  845 +++
- .../Peripherals/FM/MAC/fman_dtsec_mii_acc.c        |  163 +
- .../sdk_fman/Peripherals/FM/MAC/fman_memac.c       |  532 ++
- .../Peripherals/FM/MAC/fman_memac_mii_acc.c        |  213 +
- .../sdk_fman/Peripherals/FM/MAC/fman_tgec.c        |  367 +
- .../freescale/sdk_fman/Peripherals/FM/MAC/memac.c  | 1153 +++
- .../freescale/sdk_fman/Peripherals/FM/MAC/memac.h  |  110 +
- .../sdk_fman/Peripherals/FM/MAC/memac_mii_acc.c    |   78 +
- .../sdk_fman/Peripherals/FM/MAC/memac_mii_acc.h    |   73 +
- .../freescale/sdk_fman/Peripherals/FM/MAC/tgec.c   | 1017 +++
- .../freescale/sdk_fman/Peripherals/FM/MAC/tgec.h   |  151 +
- .../sdk_fman/Peripherals/FM/MAC/tgec_mii_acc.c     |  139 +
- .../sdk_fman/Peripherals/FM/MAC/tgec_mii_acc.h     |   80 +
- .../sdk_fman/Peripherals/FM/MACSEC/Makefile        |   15 +
- .../sdk_fman/Peripherals/FM/MACSEC/fm_macsec.c     |  237 +
- .../sdk_fman/Peripherals/FM/MACSEC/fm_macsec.h     |  203 +
- .../Peripherals/FM/MACSEC/fm_macsec_guest.c        |   59 +
- .../Peripherals/FM/MACSEC/fm_macsec_master.c       | 1031 +++
- .../Peripherals/FM/MACSEC/fm_macsec_master.h       |  479 ++
- .../Peripherals/FM/MACSEC/fm_macsec_secy.c         |  883 +++
- .../Peripherals/FM/MACSEC/fm_macsec_secy.h         |  144 +
- .../freescale/sdk_fman/Peripherals/FM/Makefile     |   23 +
- .../freescale/sdk_fman/Peripherals/FM/Pcd/Makefile |   26 +
- .../freescale/sdk_fman/Peripherals/FM/Pcd/crc64.h  |  360 +
- .../freescale/sdk_fman/Peripherals/FM/Pcd/fm_cc.c  | 7582 ++++++++++++++++++++
- .../freescale/sdk_fman/Peripherals/FM/Pcd/fm_cc.h  |  399 +
- .../freescale/sdk_fman/Peripherals/FM/Pcd/fm_kg.c  | 3242 +++++++++
- .../freescale/sdk_fman/Peripherals/FM/Pcd/fm_kg.h  |  206 +
- .../sdk_fman/Peripherals/FM/Pcd/fm_manip.c         | 5571 ++++++++++++++
- .../sdk_fman/Peripherals/FM/Pcd/fm_manip.h         |  555 ++
- .../freescale/sdk_fman/Peripherals/FM/Pcd/fm_pcd.c | 2095 ++++++
- .../freescale/sdk_fman/Peripherals/FM/Pcd/fm_pcd.h |  543 ++
- .../sdk_fman/Peripherals/FM/Pcd/fm_pcd_ipc.h       |  280 +
- .../sdk_fman/Peripherals/FM/Pcd/fm_plcr.c          | 1847 +++++
- .../sdk_fman/Peripherals/FM/Pcd/fm_plcr.h          |  165 +
- .../freescale/sdk_fman/Peripherals/FM/Pcd/fm_prs.c |  423 ++
- .../freescale/sdk_fman/Peripherals/FM/Pcd/fm_prs.h |  316 +
- .../sdk_fman/Peripherals/FM/Pcd/fm_replic.c        |  984 +++
- .../sdk_fman/Peripherals/FM/Pcd/fm_replic.h        |  101 +
- .../sdk_fman/Peripherals/FM/Pcd/fman_kg.c          |  888 +++
- .../sdk_fman/Peripherals/FM/Pcd/fman_prs.c         |  129 +
- .../sdk_fman/Peripherals/FM/Port/Makefile          |   15 +
- .../sdk_fman/Peripherals/FM/Port/fm_port.c         | 6436 +++++++++++++++++
- .../sdk_fman/Peripherals/FM/Port/fm_port.h         |  999 +++
- .../sdk_fman/Peripherals/FM/Port/fm_port_dsar.h    |  494 ++
- .../sdk_fman/Peripherals/FM/Port/fm_port_im.c      |  753 ++
- .../sdk_fman/Peripherals/FM/Port/fman_port.c       | 1568 ++++
- .../freescale/sdk_fman/Peripherals/FM/Rtc/Makefile |   15 +
- .../freescale/sdk_fman/Peripherals/FM/Rtc/fm_rtc.c |  692 ++
- .../freescale/sdk_fman/Peripherals/FM/Rtc/fm_rtc.h |   96 +
- .../sdk_fman/Peripherals/FM/Rtc/fman_rtc.c         |  334 +
- .../freescale/sdk_fman/Peripherals/FM/SP/Makefile  |   15 +
- .../freescale/sdk_fman/Peripherals/FM/SP/fm_sp.c   |  757 ++
- .../freescale/sdk_fman/Peripherals/FM/SP/fm_sp.h   |   85 +
- .../freescale/sdk_fman/Peripherals/FM/SP/fman_sp.c |  197 +
- .../freescale/sdk_fman/Peripherals/FM/fm.c         | 5216 ++++++++++++++
- .../freescale/sdk_fman/Peripherals/FM/fm.h         |  648 ++
- .../freescale/sdk_fman/Peripherals/FM/fm_ipc.h     |  465 ++
- .../freescale/sdk_fman/Peripherals/FM/fm_muram.c   |  174 +
- .../freescale/sdk_fman/Peripherals/FM/fman.c       | 1398 ++++
- .../sdk_fman/Peripherals/FM/inc/fm_common.h        | 1214 ++++
- .../freescale/sdk_fman/Peripherals/FM/inc/fm_hc.h  |   93 +
- .../sdk_fman/Peripherals/FM/inc/fm_sp_common.h     |  117 +
- .../net/ethernet/freescale/sdk_fman/etc/Makefile   |   12 +
- .../net/ethernet/freescale/sdk_fman/etc/error.c    |   95 +
drivers/net/ethernet/freescale/sdk_fman/etc/list.c |   71 +
- .../net/ethernet/freescale/sdk_fman/etc/memcpy.c   |  620 ++
drivers/net/ethernet/freescale/sdk_fman/etc/mm.c   | 1155 +++
drivers/net/ethernet/freescale/sdk_fman/etc/mm.h   |  105 +
- .../net/ethernet/freescale/sdk_fman/etc/sprint.c   |   81 +
- .../ethernet/freescale/sdk_fman/fmanv3h_dflags.h   |   57 +
- .../ethernet/freescale/sdk_fman/fmanv3l_dflags.h   |   56 +
- .../sdk_fman/inc/Peripherals/crc_mac_addr_ext.h    |  364 +
- .../freescale/sdk_fman/inc/Peripherals/dpaa_ext.h  |  210 +
- .../freescale/sdk_fman/inc/Peripherals/fm_ext.h    | 1731 +++++
- .../sdk_fman/inc/Peripherals/fm_mac_ext.h          |  887 +++
- .../sdk_fman/inc/Peripherals/fm_macsec_ext.h       | 1271 ++++
- .../sdk_fman/inc/Peripherals/fm_muram_ext.h        |  170 +
- .../sdk_fman/inc/Peripherals/fm_pcd_ext.h          | 3974 ++++++++++
- .../sdk_fman/inc/Peripherals/fm_port_ext.h         | 2608 +++++++
- .../sdk_fman/inc/Peripherals/fm_rtc_ext.h          |  619 ++
- .../sdk_fman/inc/Peripherals/fm_vsp_ext.h          |  411 ++
- .../sdk_fman/inc/Peripherals/mii_acc_ext.h         |   76 +
- .../net/ethernet/freescale/sdk_fman/inc/core_ext.h |   90 +
- .../freescale/sdk_fman/inc/cores/arm_ext.h         |   55 +
- .../freescale/sdk_fman/inc/cores/e500v2_ext.h      |  476 ++
- .../freescale/sdk_fman/inc/cores/ppc_ext.h         |  141 +
- .../ethernet/freescale/sdk_fman/inc/ddr_std_ext.h  |   77 +
- .../ethernet/freescale/sdk_fman/inc/debug_ext.h    |  233 +
- .../ethernet/freescale/sdk_fman/inc/endian_ext.h   |  447 ++
- .../net/ethernet/freescale/sdk_fman/inc/enet_ext.h |  205 +
- .../ethernet/freescale/sdk_fman/inc/error_ext.h    |  529 ++
- .../ethernet/freescale/sdk_fman/inc/etc/list_ext.h |  358 +
- .../ethernet/freescale/sdk_fman/inc/etc/mem_ext.h  |  318 +
- .../freescale/sdk_fman/inc/etc/memcpy_ext.h        |  208 +
- .../ethernet/freescale/sdk_fman/inc/etc/mm_ext.h   |  310 +
- .../freescale/sdk_fman/inc/etc/sprint_ext.h        |  118 +
- .../sdk_fman/inc/flib/common/arch/ppc_access.h     |   37 +
- .../freescale/sdk_fman/inc/flib/common/general.h   |   52 +
- .../freescale/sdk_fman/inc/flib/fman_common.h      |   78 +
- .../freescale/sdk_fman/inc/flib/fsl_enet.h         |  273 +
- .../freescale/sdk_fman/inc/flib/fsl_fman.h         |  825 +++
- .../freescale/sdk_fman/inc/flib/fsl_fman_dtsec.h   | 1096 +++
- .../sdk_fman/inc/flib/fsl_fman_dtsec_mii_acc.h     |  107 +
- .../freescale/sdk_fman/inc/flib/fsl_fman_kg.h      |  514 ++
- .../freescale/sdk_fman/inc/flib/fsl_fman_memac.h   |  434 ++
- .../sdk_fman/inc/flib/fsl_fman_memac_mii_acc.h     |   78 +
- .../freescale/sdk_fman/inc/flib/fsl_fman_port.h    |  593 ++
- .../freescale/sdk_fman/inc/flib/fsl_fman_prs.h     |  102 +
- .../freescale/sdk_fman/inc/flib/fsl_fman_rtc.h     |  449 ++
- .../freescale/sdk_fman/inc/flib/fsl_fman_sp.h      |  138 +
- .../freescale/sdk_fman/inc/flib/fsl_fman_tgec.h    |  479 ++
- .../integrations/FMANV3H/dpaa_integration_ext.h    |  291 +
- .../sdk_fman/inc/integrations/FMANV3H/part_ext.h   |   71 +
- .../integrations/FMANV3H/part_integration_ext.h    |  304 +
- .../integrations/FMANV3L/dpaa_integration_ext.h    |  293 +
- .../sdk_fman/inc/integrations/FMANV3L/part_ext.h   |   59 +
- .../integrations/FMANV3L/part_integration_ext.h    |  304 +
- .../inc/integrations/LS1043/dpaa_integration_ext.h |  291 +
- .../sdk_fman/inc/integrations/LS1043/part_ext.h    |   64 +
- .../inc/integrations/LS1043/part_integration_ext.h |  185 +
- .../inc/integrations/P1023/dpaa_integration_ext.h  |  213 +
- .../sdk_fman/inc/integrations/P1023/part_ext.h     |   82 +
- .../inc/integrations/P1023/part_integration_ext.h  |  635 ++
- .../P3040_P4080_P5020/dpaa_integration_ext.h       |  276 +
- .../inc/integrations/P3040_P4080_P5020/part_ext.h  |   83 +
- .../P3040_P4080_P5020/part_integration_ext.h       |  336 +
- .../net/ethernet/freescale/sdk_fman/inc/math_ext.h |  100 +
- .../net/ethernet/freescale/sdk_fman/inc/ncsw_ext.h |  435 ++
- .../net/ethernet/freescale/sdk_fman/inc/net_ext.h  |  430 ++
- .../net/ethernet/freescale/sdk_fman/inc/std_ext.h  |   48 +
- .../ethernet/freescale/sdk_fman/inc/stdarg_ext.h   |   49 +
- .../ethernet/freescale/sdk_fman/inc/stdlib_ext.h   |  162 +
- .../ethernet/freescale/sdk_fman/inc/string_ext.h   |   56 +
- .../ethernet/freescale/sdk_fman/inc/types_ext.h    |   62 +
- .../ethernet/freescale/sdk_fman/inc/xx_common.h    |   56 +
- .../net/ethernet/freescale/sdk_fman/inc/xx_ext.h   |  791 ++
- .../ethernet/freescale/sdk_fman/ls1043_dflags.h    |   56 +
- .../net/ethernet/freescale/sdk_fman/ncsw_config.mk |   53 +
- .../net/ethernet/freescale/sdk_fman/p1023_dflags.h |   65 +
- .../freescale/sdk_fman/p3040_4080_5020_dflags.h    |   62 +
- .../net/ethernet/freescale/sdk_fman/src/Makefile   |   11 +
- .../freescale/sdk_fman/src/inc/system/sys_ext.h    |  118 +
- .../freescale/sdk_fman/src/inc/system/sys_io_ext.h |   46 +
- .../freescale/sdk_fman/src/inc/types_linux.h       |  208 +
- .../sdk_fman/src/inc/wrapper/fsl_fman_test.h       |   84 +
- .../sdk_fman/src/inc/wrapper/lnxwrp_exp_sym.h      |  130 +
- .../sdk_fman/src/inc/wrapper/lnxwrp_fm_ext.h       |  163 +
- .../sdk_fman/src/inc/wrapper/lnxwrp_fsl_fman.h     |  921 +++
- .../ethernet/freescale/sdk_fman/src/inc/xx/xx.h    |   50 +
- .../freescale/sdk_fman/src/system/Makefile         |   10 +
- .../freescale/sdk_fman/src/system/sys_io.c         |  171 +
- .../freescale/sdk_fman/src/wrapper/Makefile        |   19 +
- .../freescale/sdk_fman/src/wrapper/fman_test.c     | 1665 +++++
- .../freescale/sdk_fman/src/wrapper/lnxwrp_fm.c     | 2908 ++++++++
- .../freescale/sdk_fman/src/wrapper/lnxwrp_fm.h     |  294 +
- .../sdk_fman/src/wrapper/lnxwrp_fm_port.c          | 1480 ++++
- .../sdk_fman/src/wrapper/lnxwrp_ioctls_fm.c        | 4854 +++++++++++++
- .../sdk_fman/src/wrapper/lnxwrp_ioctls_fm_compat.c | 1297 ++++
- .../sdk_fman/src/wrapper/lnxwrp_ioctls_fm_compat.h |  755 ++
- .../sdk_fman/src/wrapper/lnxwrp_resources.h        |  121 +
- .../sdk_fman/src/wrapper/lnxwrp_resources_ut.c     |  191 +
- .../sdk_fman/src/wrapper/lnxwrp_resources_ut.h     |  144 +
- .../sdk_fman/src/wrapper/lnxwrp_resources_ut.make  |   28 +
- .../freescale/sdk_fman/src/wrapper/lnxwrp_sysfs.c  |   60 +
- .../freescale/sdk_fman/src/wrapper/lnxwrp_sysfs.h  |   60 +
- .../sdk_fman/src/wrapper/lnxwrp_sysfs_fm.c         | 1855 +++++
- .../sdk_fman/src/wrapper/lnxwrp_sysfs_fm.h         |  136 +
- .../sdk_fman/src/wrapper/lnxwrp_sysfs_fm_port.c    | 1268 ++++
- .../sdk_fman/src/wrapper/lnxwrp_sysfs_fm_port.h    |   56 +
- .../ethernet/freescale/sdk_fman/src/xx/Makefile    |   18 +
- .../freescale/sdk_fman/src/xx/module_strings.c     |   46 +
- .../freescale/sdk_fman/src/xx/xx_arm_linux.c       |  905 +++
- .../ethernet/freescale/sdk_fman/src/xx/xx_linux.c  |  918 +++
- drivers/staging/fsl_qbman/Kconfig                  |  228 +
- drivers/staging/fsl_qbman/Makefile                 |   28 +
- drivers/staging/fsl_qbman/bman_config.c            |  720 ++
- drivers/staging/fsl_qbman/bman_debugfs.c           |  119 +
- drivers/staging/fsl_qbman/bman_driver.c            |  575 ++
- drivers/staging/fsl_qbman/bman_high.c              | 1145 +++
- drivers/staging/fsl_qbman/bman_low.h               |  565 ++
- drivers/staging/fsl_qbman/bman_private.h           |  166 +
- drivers/staging/fsl_qbman/bman_test.c              |   56 +
- drivers/staging/fsl_qbman/bman_test.h              |   44 +
- drivers/staging/fsl_qbman/bman_test_high.c         |  183 +
- drivers/staging/fsl_qbman/bman_test_thresh.c       |  196 +
- drivers/staging/fsl_qbman/dpa_alloc.c              |  706 ++
- drivers/staging/fsl_qbman/dpa_sys.h                |  259 +
- drivers/staging/fsl_qbman/dpa_sys_arm.h            |   95 +
- drivers/staging/fsl_qbman/dpa_sys_arm64.h          |  102 +
- drivers/staging/fsl_qbman/dpa_sys_ppc32.h          |   70 +
- drivers/staging/fsl_qbman/dpa_sys_ppc64.h          |   79 +
- drivers/staging/fsl_qbman/fsl_usdpaa.c             | 2007 ++++++
- drivers/staging/fsl_qbman/fsl_usdpaa_irq.c         |  289 +
- drivers/staging/fsl_qbman/qbman_driver.c           |   88 +
- drivers/staging/fsl_qbman/qman_config.c            | 1224 ++++
- drivers/staging/fsl_qbman/qman_debugfs.c           | 1594 ++++
- drivers/staging/fsl_qbman/qman_driver.c            |  977 +++
- drivers/staging/fsl_qbman/qman_high.c              | 5669 +++++++++++++++
- drivers/staging/fsl_qbman/qman_low.h               | 1442 ++++
- drivers/staging/fsl_qbman/qman_private.h           |  398 +
- drivers/staging/fsl_qbman/qman_test.c              |   57 +
- drivers/staging/fsl_qbman/qman_test.h              |   45 +
- drivers/staging/fsl_qbman/qman_test_high.c         |  216 +
drivers/staging/fsl_qbman/qman_test_hotpotato.c    |  502 ++
- drivers/staging/fsl_qbman/qman_utility.c           |  129 +
- include/linux/fsl_bman.h                           |  532 ++
- include/linux/fsl_qman.h                           | 3888 ++++++++++
- include/linux/fsl_usdpaa.h                         |  372 +
- include/uapi/linux/fmd/Kbuild                      |    5 +
- include/uapi/linux/fmd/Peripherals/Kbuild          |    4 +
include/uapi/linux/fmd/Peripherals/fm_ioctls.h     |  628 ++
include/uapi/linux/fmd/Peripherals/fm_pcd_ioctls.h | 3084 ++++++++
- .../uapi/linux/fmd/Peripherals/fm_port_ioctls.h    |  973 +++
- .../uapi/linux/fmd/Peripherals/fm_test_ioctls.h    |  208 +
- include/uapi/linux/fmd/integrations/Kbuild         |    1 +
- .../linux/fmd/integrations/integration_ioctls.h    |   56 +
- include/uapi/linux/fmd/ioctls.h                    |   96 +
- include/uapi/linux/fmd/net_ioctls.h                |  430 ++
- 257 files changed, 153236 insertions(+)
.../net/ethernet/freescale/sdk_dpaa/Kconfig   |  196 +
.../net/ethernet/freescale/sdk_dpaa/Makefile  |   46 +
+ .../ethernet/freescale/sdk_dpaa/dpaa_1588.c   |  580 ++
+ .../ethernet/freescale/sdk_dpaa/dpaa_1588.h   |  138 +
+ .../freescale/sdk_dpaa/dpaa_debugfs.c         |  180 +
+ .../freescale/sdk_dpaa/dpaa_debugfs.h         |   43 +
.../ethernet/freescale/sdk_dpaa/dpaa_eth.c    | 1224 +++
.../ethernet/freescale/sdk_dpaa/dpaa_eth.h    |  687 ++
+ .../freescale/sdk_dpaa/dpaa_eth_base.c        |  205 +
+ .../freescale/sdk_dpaa/dpaa_eth_base.h        |   49 +
+ .../freescale/sdk_dpaa/dpaa_eth_ceetm.c       | 2115 +++++
+ .../freescale/sdk_dpaa/dpaa_eth_ceetm.h       |  240 +
+ .../freescale/sdk_dpaa/dpaa_eth_common.c      | 1802 ++++
+ .../freescale/sdk_dpaa/dpaa_eth_common.h      |  225 +
+ .../freescale/sdk_dpaa/dpaa_eth_proxy.c       |  381 +
+ .../ethernet/freescale/sdk_dpaa/dpaa_eth_sg.c | 1193 +++
+ .../freescale/sdk_dpaa/dpaa_eth_sysfs.c       |  278 +
+ .../freescale/sdk_dpaa/dpaa_eth_trace.h       |  144 +
+ .../freescale/sdk_dpaa/dpaa_ethtool.c         |  544 ++
.../ethernet/freescale/sdk_dpaa/dpaa_ptp.c    |  291 +
.../net/ethernet/freescale/sdk_dpaa/mac-api.c |  931 ++
+ drivers/net/ethernet/freescale/sdk_dpaa/mac.c |  489 ++
+ drivers/net/ethernet/freescale/sdk_dpaa/mac.h |  135 +
+ .../freescale/sdk_dpaa/offline_port.c         |  848 ++
+ .../freescale/sdk_dpaa/offline_port.h         |   59 +
.../net/ethernet/freescale/sdk_fman/Kconfig   |  153 +
.../net/ethernet/freescale/sdk_fman/Makefile  |   11 +
+ .../sdk_fman/Peripherals/FM/HC/Makefile       |   15 +
+ .../freescale/sdk_fman/Peripherals/FM/HC/hc.c | 1232 +++
+ .../sdk_fman/Peripherals/FM/MAC/Makefile      |   28 +
+ .../sdk_fman/Peripherals/FM/MAC/dtsec.c       | 1504 ++++
+ .../sdk_fman/Peripherals/FM/MAC/dtsec.h       |  228 +
+ .../Peripherals/FM/MAC/dtsec_mii_acc.c        |   97 +
+ .../Peripherals/FM/MAC/dtsec_mii_acc.h        |   42 +
+ .../sdk_fman/Peripherals/FM/MAC/fm_mac.c      |  674 ++
+ .../sdk_fman/Peripherals/FM/MAC/fm_mac.h      |  226 +
+ .../sdk_fman/Peripherals/FM/MAC/fman_crc32.c  |  119 +
+ .../sdk_fman/Peripherals/FM/MAC/fman_crc32.h  |   43 +
+ .../sdk_fman/Peripherals/FM/MAC/fman_dtsec.c  |  845 ++
+ .../Peripherals/FM/MAC/fman_dtsec_mii_acc.c   |  163 +
+ .../sdk_fman/Peripherals/FM/MAC/fman_memac.c  |  532 ++
+ .../Peripherals/FM/MAC/fman_memac_mii_acc.c   |  213 +
+ .../sdk_fman/Peripherals/FM/MAC/fman_tgec.c   |  367 +
+ .../sdk_fman/Peripherals/FM/MAC/memac.c       | 1153 +++
+ .../sdk_fman/Peripherals/FM/MAC/memac.h       |  110 +
+ .../Peripherals/FM/MAC/memac_mii_acc.c        |   78 +
+ .../Peripherals/FM/MAC/memac_mii_acc.h        |   73 +
+ .../sdk_fman/Peripherals/FM/MAC/tgec.c        | 1017 +++
+ .../sdk_fman/Peripherals/FM/MAC/tgec.h        |  151 +
+ .../Peripherals/FM/MAC/tgec_mii_acc.c         |  139 +
+ .../Peripherals/FM/MAC/tgec_mii_acc.h         |   80 +
+ .../sdk_fman/Peripherals/FM/MACSEC/Makefile   |   15 +
+ .../Peripherals/FM/MACSEC/fm_macsec.c         |  237 +
+ .../Peripherals/FM/MACSEC/fm_macsec.h         |  203 +
+ .../Peripherals/FM/MACSEC/fm_macsec_guest.c   |   59 +
+ .../Peripherals/FM/MACSEC/fm_macsec_master.c  | 1031 +++
+ .../Peripherals/FM/MACSEC/fm_macsec_master.h  |  479 ++
+ .../Peripherals/FM/MACSEC/fm_macsec_secy.c    |  883 ++
+ .../Peripherals/FM/MACSEC/fm_macsec_secy.h    |  144 +
+ .../sdk_fman/Peripherals/FM/Makefile          |   23 +
+ .../sdk_fman/Peripherals/FM/Pcd/Makefile      |   26 +
+ .../sdk_fman/Peripherals/FM/Pcd/crc64.h       |  360 +
+ .../sdk_fman/Peripherals/FM/Pcd/fm_cc.c       | 7582 +++++++++++++++++
+ .../sdk_fman/Peripherals/FM/Pcd/fm_cc.h       |  399 +
+ .../sdk_fman/Peripherals/FM/Pcd/fm_kg.c       | 3242 +++++++
+ .../sdk_fman/Peripherals/FM/Pcd/fm_kg.h       |  206 +
+ .../sdk_fman/Peripherals/FM/Pcd/fm_manip.c    | 5571 ++++++++++++
+ .../sdk_fman/Peripherals/FM/Pcd/fm_manip.h    |  555 ++
+ .../sdk_fman/Peripherals/FM/Pcd/fm_pcd.c      | 2095 +++++
+ .../sdk_fman/Peripherals/FM/Pcd/fm_pcd.h      |  543 ++
+ .../sdk_fman/Peripherals/FM/Pcd/fm_pcd_ipc.h  |  280 +
+ .../sdk_fman/Peripherals/FM/Pcd/fm_plcr.c     | 1847 ++++
+ .../sdk_fman/Peripherals/FM/Pcd/fm_plcr.h     |  165 +
+ .../sdk_fman/Peripherals/FM/Pcd/fm_prs.c      |  423 +
+ .../sdk_fman/Peripherals/FM/Pcd/fm_prs.h      |  316 +
+ .../sdk_fman/Peripherals/FM/Pcd/fm_replic.c   |  984 +++
+ .../sdk_fman/Peripherals/FM/Pcd/fm_replic.h   |  101 +
+ .../sdk_fman/Peripherals/FM/Pcd/fman_kg.c     |  888 ++
+ .../sdk_fman/Peripherals/FM/Pcd/fman_prs.c    |  129 +
+ .../sdk_fman/Peripherals/FM/Port/Makefile     |   15 +
+ .../sdk_fman/Peripherals/FM/Port/fm_port.c    | 6436 ++++++++++++++
+ .../sdk_fman/Peripherals/FM/Port/fm_port.h    |  999 +++
+ .../Peripherals/FM/Port/fm_port_dsar.h        |  494 ++
+ .../sdk_fman/Peripherals/FM/Port/fm_port_im.c |  753 ++
+ .../sdk_fman/Peripherals/FM/Port/fman_port.c  | 1568 ++++
+ .../sdk_fman/Peripherals/FM/Rtc/Makefile      |   15 +
+ .../sdk_fman/Peripherals/FM/Rtc/fm_rtc.c      |  692 ++
+ .../sdk_fman/Peripherals/FM/Rtc/fm_rtc.h      |   96 +
+ .../sdk_fman/Peripherals/FM/Rtc/fman_rtc.c    |  334 +
+ .../sdk_fman/Peripherals/FM/SP/Makefile       |   15 +
+ .../sdk_fman/Peripherals/FM/SP/fm_sp.c        |  757 ++
+ .../sdk_fman/Peripherals/FM/SP/fm_sp.h        |   85 +
+ .../sdk_fman/Peripherals/FM/SP/fman_sp.c      |  197 +
+ .../freescale/sdk_fman/Peripherals/FM/fm.c    | 5216 ++++++++++++
+ .../freescale/sdk_fman/Peripherals/FM/fm.h    |  648 ++
+ .../sdk_fman/Peripherals/FM/fm_ipc.h          |  465 +
+ .../sdk_fman/Peripherals/FM/fm_muram.c        |  174 +
+ .../freescale/sdk_fman/Peripherals/FM/fman.c  | 1398 +++
+ .../sdk_fman/Peripherals/FM/inc/fm_common.h   | 1214 +++
+ .../sdk_fman/Peripherals/FM/inc/fm_hc.h       |   93 +
+ .../Peripherals/FM/inc/fm_sp_common.h         |  117 +
+ .../ethernet/freescale/sdk_fman/etc/Makefile  |   12 +
+ .../ethernet/freescale/sdk_fman/etc/error.c   |   95 +
.../ethernet/freescale/sdk_fman/etc/list.c    |   71 +
+ .../ethernet/freescale/sdk_fman/etc/memcpy.c  |  620 ++
.../net/ethernet/freescale/sdk_fman/etc/mm.c  | 1155 +++
.../net/ethernet/freescale/sdk_fman/etc/mm.h  |  105 +
+ .../ethernet/freescale/sdk_fman/etc/sprint.c  |   81 +
+ .../freescale/sdk_fman/fmanv3h_dflags.h       |   57 +
+ .../freescale/sdk_fman/fmanv3l_dflags.h       |   56 +
+ .../inc/Peripherals/crc_mac_addr_ext.h        |  364 +
+ .../sdk_fman/inc/Peripherals/dpaa_ext.h       |  210 +
+ .../sdk_fman/inc/Peripherals/fm_ext.h         | 1731 ++++
+ .../sdk_fman/inc/Peripherals/fm_mac_ext.h     |  887 ++
+ .../sdk_fman/inc/Peripherals/fm_macsec_ext.h  | 1271 +++
+ .../sdk_fman/inc/Peripherals/fm_muram_ext.h   |  170 +
+ .../sdk_fman/inc/Peripherals/fm_pcd_ext.h     | 3974 +++++++++
+ .../sdk_fman/inc/Peripherals/fm_port_ext.h    | 2608 ++++++
+ .../sdk_fman/inc/Peripherals/fm_rtc_ext.h     |  619 ++
+ .../sdk_fman/inc/Peripherals/fm_vsp_ext.h     |  411 +
+ .../sdk_fman/inc/Peripherals/mii_acc_ext.h    |   76 +
+ .../freescale/sdk_fman/inc/core_ext.h         |   90 +
+ .../freescale/sdk_fman/inc/cores/arm_ext.h    |   55 +
+ .../freescale/sdk_fman/inc/cores/e500v2_ext.h |  476 ++
+ .../freescale/sdk_fman/inc/cores/ppc_ext.h    |  141 +
+ .../freescale/sdk_fman/inc/ddr_std_ext.h      |   77 +
+ .../freescale/sdk_fman/inc/debug_ext.h        |  233 +
+ .../freescale/sdk_fman/inc/endian_ext.h       |  447 +
+ .../freescale/sdk_fman/inc/enet_ext.h         |  205 +
+ .../freescale/sdk_fman/inc/error_ext.h        |  529 ++
+ .../freescale/sdk_fman/inc/etc/list_ext.h     |  358 +
+ .../freescale/sdk_fman/inc/etc/mem_ext.h      |  318 +
+ .../freescale/sdk_fman/inc/etc/memcpy_ext.h   |  208 +
+ .../freescale/sdk_fman/inc/etc/mm_ext.h       |  310 +
+ .../freescale/sdk_fman/inc/etc/sprint_ext.h   |  118 +
+ .../inc/flib/common/arch/ppc_access.h         |   37 +
+ .../sdk_fman/inc/flib/common/general.h        |   52 +
+ .../freescale/sdk_fman/inc/flib/fman_common.h |   78 +
+ .../freescale/sdk_fman/inc/flib/fsl_enet.h    |  273 +
+ .../freescale/sdk_fman/inc/flib/fsl_fman.h    |  825 ++
+ .../sdk_fman/inc/flib/fsl_fman_dtsec.h        | 1096 +++
+ .../inc/flib/fsl_fman_dtsec_mii_acc.h         |  107 +
+ .../freescale/sdk_fman/inc/flib/fsl_fman_kg.h |  514 ++
+ .../sdk_fman/inc/flib/fsl_fman_memac.h        |  434 +
+ .../inc/flib/fsl_fman_memac_mii_acc.h         |   78 +
+ .../sdk_fman/inc/flib/fsl_fman_port.h         |  593 ++
+ .../sdk_fman/inc/flib/fsl_fman_prs.h          |  102 +
+ .../sdk_fman/inc/flib/fsl_fman_rtc.h          |  449 +
+ .../freescale/sdk_fman/inc/flib/fsl_fman_sp.h |  138 +
+ .../sdk_fman/inc/flib/fsl_fman_tgec.h         |  479 ++
+ .../FMANV3H/dpaa_integration_ext.h            |  291 +
+ .../inc/integrations/FMANV3H/part_ext.h       |   71 +
+ .../FMANV3H/part_integration_ext.h            |  304 +
+ .../FMANV3L/dpaa_integration_ext.h            |  293 +
+ .../inc/integrations/FMANV3L/part_ext.h       |   59 +
+ .../FMANV3L/part_integration_ext.h            |  304 +
+ .../LS1043/dpaa_integration_ext.h             |  291 +
+ .../inc/integrations/LS1043/part_ext.h        |   64 +
+ .../LS1043/part_integration_ext.h             |  185 +
+ .../integrations/P1023/dpaa_integration_ext.h |  213 +
+ .../inc/integrations/P1023/part_ext.h         |   82 +
+ .../integrations/P1023/part_integration_ext.h |  635 ++
+ .../P3040_P4080_P5020/dpaa_integration_ext.h  |  276 +
+ .../integrations/P3040_P4080_P5020/part_ext.h |   83 +
+ .../P3040_P4080_P5020/part_integration_ext.h  |  336 +
+ .../freescale/sdk_fman/inc/math_ext.h         |  100 +
+ .../freescale/sdk_fman/inc/ncsw_ext.h         |  435 +
+ .../ethernet/freescale/sdk_fman/inc/net_ext.h |  430 +
+ .../ethernet/freescale/sdk_fman/inc/std_ext.h |   48 +
+ .../freescale/sdk_fman/inc/stdarg_ext.h       |   49 +
+ .../freescale/sdk_fman/inc/stdlib_ext.h       |  162 +
+ .../freescale/sdk_fman/inc/string_ext.h       |   56 +
+ .../freescale/sdk_fman/inc/types_ext.h        |   62 +
+ .../freescale/sdk_fman/inc/xx_common.h        |   56 +
+ .../ethernet/freescale/sdk_fman/inc/xx_ext.h  |  791 ++
+ .../freescale/sdk_fman/ls1043_dflags.h        |   56 +
+ .../freescale/sdk_fman/ncsw_config.mk         |   53 +
+ .../freescale/sdk_fman/p1023_dflags.h         |   65 +
+ .../sdk_fman/p3040_4080_5020_dflags.h         |   62 +
+ .../ethernet/freescale/sdk_fman/src/Makefile  |   11 +
+ .../sdk_fman/src/inc/system/sys_ext.h         |  118 +
+ .../sdk_fman/src/inc/system/sys_io_ext.h      |   46 +
+ .../freescale/sdk_fman/src/inc/types_linux.h  |  208 +
+ .../sdk_fman/src/inc/wrapper/fsl_fman_test.h  |   84 +
+ .../sdk_fman/src/inc/wrapper/lnxwrp_exp_sym.h |  130 +
+ .../sdk_fman/src/inc/wrapper/lnxwrp_fm_ext.h  |  163 +
+ .../src/inc/wrapper/lnxwrp_fsl_fman.h         |  921 ++
+ .../freescale/sdk_fman/src/inc/xx/xx.h        |   50 +
+ .../freescale/sdk_fman/src/system/Makefile    |   10 +
+ .../freescale/sdk_fman/src/system/sys_io.c    |  171 +
+ .../freescale/sdk_fman/src/wrapper/Makefile   |   19 +
+ .../sdk_fman/src/wrapper/fman_test.c          | 1665 ++++
+ .../sdk_fman/src/wrapper/lnxwrp_fm.c          | 2908 +++++++
+ .../sdk_fman/src/wrapper/lnxwrp_fm.h          |  294 +
+ .../sdk_fman/src/wrapper/lnxwrp_fm_port.c     | 1512 ++++
+ .../sdk_fman/src/wrapper/lnxwrp_ioctls_fm.c   | 4854 +++++++++++
+ .../src/wrapper/lnxwrp_ioctls_fm_compat.c     | 1297 +++
+ .../src/wrapper/lnxwrp_ioctls_fm_compat.h     |  755 ++
+ .../sdk_fman/src/wrapper/lnxwrp_resources.h   |  121 +
+ .../src/wrapper/lnxwrp_resources_ut.c         |  191 +
+ .../src/wrapper/lnxwrp_resources_ut.h         |  144 +
+ .../src/wrapper/lnxwrp_resources_ut.make      |   28 +
+ .../sdk_fman/src/wrapper/lnxwrp_sysfs.c       |   60 +
+ .../sdk_fman/src/wrapper/lnxwrp_sysfs.h       |   60 +
+ .../sdk_fman/src/wrapper/lnxwrp_sysfs_fm.c    | 1855 ++++
+ .../sdk_fman/src/wrapper/lnxwrp_sysfs_fm.h    |  136 +
+ .../src/wrapper/lnxwrp_sysfs_fm_port.c        | 1268 +++
+ .../src/wrapper/lnxwrp_sysfs_fm_port.h        |   56 +
+ .../freescale/sdk_fman/src/xx/Makefile        |   18 +
+ .../sdk_fman/src/xx/module_strings.c          |   46 +
+ .../freescale/sdk_fman/src/xx/xx_arm_linux.c  |  905 ++
+ .../freescale/sdk_fman/src/xx/xx_linux.c      |  918 ++
+ drivers/staging/fsl_qbman/Kconfig             |  228 +
+ drivers/staging/fsl_qbman/Makefile            |   28 +
+ drivers/staging/fsl_qbman/bman_config.c       |  720 ++
+ drivers/staging/fsl_qbman/bman_debugfs.c      |  119 +
+ drivers/staging/fsl_qbman/bman_driver.c       |  575 ++
+ drivers/staging/fsl_qbman/bman_high.c         | 1145 +++
+ drivers/staging/fsl_qbman/bman_low.h          |  565 ++
+ drivers/staging/fsl_qbman/bman_private.h      |  166 +
+ drivers/staging/fsl_qbman/bman_test.c         |   56 +
+ drivers/staging/fsl_qbman/bman_test.h         |   44 +
+ drivers/staging/fsl_qbman/bman_test_high.c    |  183 +
+ drivers/staging/fsl_qbman/bman_test_thresh.c  |  196 +
+ drivers/staging/fsl_qbman/dpa_alloc.c         |  706 ++
+ drivers/staging/fsl_qbman/dpa_sys.h           |  259 +
+ drivers/staging/fsl_qbman/dpa_sys_arm.h       |   95 +
+ drivers/staging/fsl_qbman/dpa_sys_arm64.h     |  102 +
+ drivers/staging/fsl_qbman/dpa_sys_ppc32.h     |   70 +
+ drivers/staging/fsl_qbman/dpa_sys_ppc64.h     |   79 +
+ drivers/staging/fsl_qbman/fsl_usdpaa.c        | 2007 +++++
+ drivers/staging/fsl_qbman/fsl_usdpaa_irq.c    |  289 +
+ drivers/staging/fsl_qbman/qbman_driver.c      |   88 +
+ drivers/staging/fsl_qbman/qman_config.c       | 1224 +++
+ drivers/staging/fsl_qbman/qman_debugfs.c      | 1594 ++++
+ drivers/staging/fsl_qbman/qman_driver.c       |  977 +++
+ drivers/staging/fsl_qbman/qman_high.c         | 5652 ++++++++++++
+ drivers/staging/fsl_qbman/qman_low.h          | 1442 ++++
+ drivers/staging/fsl_qbman/qman_private.h      |  398 +
+ drivers/staging/fsl_qbman/qman_test.c         |   57 +
+ drivers/staging/fsl_qbman/qman_test.h         |   45 +
+ drivers/staging/fsl_qbman/qman_test_high.c    |  216 +
.../staging/fsl_qbman/qman_test_hotpotato.c   |  502 ++
+ drivers/staging/fsl_qbman/qman_utility.c      |  129 +
+ include/linux/fsl_bman.h                      |  532 ++
+ include/linux/fsl_qman.h                      | 3900 +++++++++
+ include/linux/fsl_usdpaa.h                    |  372 +
+ include/uapi/linux/fmd/Kbuild                 |    5 +
+ include/uapi/linux/fmd/Peripherals/Kbuild     |    4 +
.../uapi/linux/fmd/Peripherals/fm_ioctls.h    |  628 ++
.../linux/fmd/Peripherals/fm_pcd_ioctls.h     | 3084 +++++++
+ .../linux/fmd/Peripherals/fm_port_ioctls.h    |  973 +++
+ .../linux/fmd/Peripherals/fm_test_ioctls.h    |  208 +
+ include/uapi/linux/fmd/integrations/Kbuild    |    1 +
+ .../fmd/integrations/integration_ioctls.h     |   56 +
+ include/uapi/linux/fmd/ioctls.h               |   96 +
+ include/uapi/linux/fmd/net_ioctls.h           |  430 +
+ 257 files changed, 153455 insertions(+)
  create mode 100644 drivers/net/ethernet/freescale/sdk_dpaa/Kconfig
  create mode 100644 drivers/net/ethernet/freescale/sdk_dpaa/Makefile
  create mode 100644 drivers/net/ethernet/freescale/sdk_dpaa/dpaa_1588.c
@@ -3908,7 +3908,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#endif /* __DPAA_ETH_BASE_H */
 --- /dev/null
 +++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.c
-@@ -0,0 +1,2013 @@
+@@ -0,0 +1,2115 @@
 +/* Copyright 2008-2016 Freescale Semiconductor Inc.
 + *
 + * Redistribution and use in source and binary forms, with or without
@@ -3976,6 +3976,76 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      }
 +}
 +
++/* Wait for the DPAA Eth driver WQ TX FQs to empty */
++static void dpaa_drain_fqs(struct net_device *dev)
++{
++      const struct dpa_priv_s *priv = netdev_priv(dev);
++      struct qm_mcr_queryfq_np np;
++      struct qman_fq *fq;
++      int ret, i;
++
++      for (i = 0; i < DPAA_ETH_TX_QUEUES; i ++) {
++              fq = priv->egress_fqs[i];
++              while (true) {
++                      ret = qman_query_fq_np(fq, &np);
++                      if (unlikely(ret)) {
++                              pr_err(KBUILD_BASENAME
++                                     " : %s : unable to query FQ %x: %d\n",
++                                     __func__, fq->fqid, ret);
++                              break;
++                      }
++
++                      if (np.frm_cnt == 0)
++                              break;
++              }
++      }
++}
++
++/* Wait for the DPAA CEETM TX CQs to empty */
++static void ceetm_drain_class(struct ceetm_class *cl)
++{
++      struct qm_mcr_ceetm_cq_query cq_query;
++      struct qm_ceetm_cq *cq;
++      unsigned int idx;
++      int ret;
++
++      if (!cl)
++              return;
++
++      switch (cl->type) {
++      case CEETM_ROOT:
++              /* The ROOT classes aren't directly linked to CEETM CQs */
++              return;
++      case CEETM_PRIO:
++              cq = (struct qm_ceetm_cq*)cl->prio.cq;
++              break;
++      case CEETM_WBFS:
++              cq = (struct qm_ceetm_cq*)cl->wbfs.cq;
++              break;
++      }
++
++      if (!cq || !cl->ch)
++              return;
++
++      /* Build the query CQID by merging the channel and the CQ IDs */
++      idx = (cq->parent->idx << 4) | cq->idx;
++
++      while (true) {
++              ret = qman_ceetm_query_cq(idx,
++                                        cl->ch->dcp_idx,
++                                        &cq_query);
++              if (unlikely(ret)) {
++                      pr_err(KBUILD_BASENAME
++                             " : %s : unable to query CQ %x: %d\n",
++                             __func__, idx, ret);
++                      break;
++              }
++
++              if (cq_query.frm_cnt == 0)
++                      break;
++      }
++}
++
 +/* Enqueue Rejection Notification callback */
 +static void ceetm_ern(struct qman_portal *portal, struct qman_fq *fq,
 +                    const struct qm_mr_entry *msg)
@@ -4153,7 +4223,6 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +/* Configure a prio ceetm class */
 +static int ceetm_config_prio_cls(struct ceetm_class *cls,
 +                               struct net_device *dev,
-+                               struct qm_ceetm_channel *channel,
 +                               unsigned int id)
 +{
 +      int err;
@@ -4164,22 +4233,22 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              return err;
 +
 +      /* Claim and configure the CCG */
-+      err = ceetm_config_ccg(&cls->prio.ccg, channel, id, cls->prio.fq,
++      err = ceetm_config_ccg(&cls->prio.ccg, cls->ch, id, cls->prio.fq,
 +                             dpa_priv);
 +      if (err)
 +              return err;
 +
 +      /* Claim and configure the CQ */
-+      err = qman_ceetm_cq_claim(&cls->prio.cq, channel, id, cls->prio.ccg);
++      err = qman_ceetm_cq_claim(&cls->prio.cq, cls->ch, id, cls->prio.ccg);
 +      if (err)
 +              return err;
 +
 +      if (cls->shaped) {
-+              err = qman_ceetm_channel_set_cq_cr_eligibility(channel, id, 1);
++              err = qman_ceetm_channel_set_cq_cr_eligibility(cls->ch, id, 1);
 +              if (err)
 +                      return err;
 +
-+              err = qman_ceetm_channel_set_cq_er_eligibility(channel, id, 1);
++              err = qman_ceetm_channel_set_cq_er_eligibility(cls->ch, id, 1);
 +              if (err)
 +                      return err;
 +      }
@@ -4195,7 +4264,6 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +/* Configure a wbfs ceetm class */
 +static int ceetm_config_wbfs_cls(struct ceetm_class *cls,
 +                               struct net_device *dev,
-+                               struct qm_ceetm_channel *channel,
 +                               unsigned int id, int type)
 +{
 +      int err;
@@ -4206,17 +4274,17 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              return err;
 +
 +      /* Claim and configure the CCG */
-+      err = ceetm_config_ccg(&cls->wbfs.ccg, channel, id, cls->wbfs.fq,
++      err = ceetm_config_ccg(&cls->wbfs.ccg, cls->ch, id, cls->wbfs.fq,
 +                             dpa_priv);
 +      if (err)
 +              return err;
 +
 +      /* Claim and configure the CQ */
 +      if (type == WBFS_GRP_B)
-+              err = qman_ceetm_cq_claim_B(&cls->wbfs.cq, channel, id,
++              err = qman_ceetm_cq_claim_B(&cls->wbfs.cq, cls->ch, id,
 +                                          cls->wbfs.ccg);
 +      else
-+              err = qman_ceetm_cq_claim_A(&cls->wbfs.cq, channel, id,
++              err = qman_ceetm_cq_claim_A(&cls->wbfs.cq, cls->ch, id,
 +                                          cls->wbfs.ccg);
 +      if (err)
 +              return err;
@@ -4264,6 +4332,8 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +/* Destroy a ceetm class */
 +static void ceetm_cls_destroy(struct Qdisc *sch, struct ceetm_class *cl)
 +{
++      struct net_device *dev = qdisc_dev(sch);
++
 +      if (!cl)
 +              return;
 +
@@ -4277,10 +4347,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      cl->root.child = NULL;
 +              }
 +
-+              if (cl->root.ch && qman_ceetm_channel_release(cl->root.ch))
++              if (cl->ch && qman_ceetm_channel_release(cl->ch))
 +                      pr_err(KBUILD_BASENAME
 +                             " : %s : error releasing the channel %d\n",
-+                             __func__, cl->root.ch->idx);
++                             __func__, cl->ch->idx);
 +
 +              break;
 +
@@ -4290,6 +4360,12 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      cl->prio.child = NULL;
 +              }
 +
++              /* We must make sure the CQ is empty before releasing it.
++               * Pause all transmissions while we wait for it to drain.
++               */
++              netif_tx_stop_all_queues(dev);
++              ceetm_drain_class(cl);
++
 +              if (cl->prio.lfq && qman_ceetm_lfq_release(cl->prio.lfq))
 +                      pr_err(KBUILD_BASENAME
 +                             " : %s : error releasing the LFQ %d\n",
@@ -4310,9 +4386,16 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              if (cl->prio.cstats)
 +                      free_percpu(cl->prio.cstats);
 +
++              netif_tx_wake_all_queues(dev);
 +              break;
 +
 +      case CEETM_WBFS:
++              /* We must make sure the CQ is empty before releasing it.
++               * Pause all transmissions while we wait for it to drain.
++               */
++              netif_tx_stop_all_queues(dev);
++              ceetm_drain_class(cl);
++
 +              if (cl->wbfs.lfq && qman_ceetm_lfq_release(cl->wbfs.lfq))
 +                      pr_err(KBUILD_BASENAME
 +                             " : %s : error releasing the LFQ %d\n",
@@ -4332,6 +4415,8 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +              if (cl->wbfs.cstats)
 +                      free_percpu(cl->wbfs.cstats);
++
++              netif_tx_wake_all_queues(dev);
 +      }
 +
 +      tcf_destroy_chain(&cl->filter_list);
@@ -4386,7 +4471,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              if (!priv->root.qdiscs)
 +                      break;
 +
-+              /* Remove the pfifo qdiscs */
++              /* Destroy the pfifo qdiscs in case they haven't been attached
++               * to the netdev queues yet.
++               */
 +              for (ntx = 0; ntx < dev->num_tx_queues; ntx++)
 +                      if (priv->root.qdiscs[ntx])
 +                              qdisc_destroy(priv->root.qdiscs[ntx]);
@@ -4400,6 +4487,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              break;
 +
 +      case CEETM_WBFS:
++              /* Reset the WBFS groups and priorities */
++              if (priv->wbfs.ch)
++                      qman_ceetm_channel_set_group(priv->wbfs.ch, 1, 0, 0);
++
 +              if (priv->wbfs.parent)
 +                      priv->wbfs.parent->prio.child = NULL;
 +              break;
@@ -4516,7 +4607,16 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              goto err_init_root;
 +      }
 +
-+      /* pre-allocate underlying pfifo qdiscs */
++      /* Pre-allocate underlying pfifo qdiscs.
++       *
++       * We want to offload shaping and scheduling decisions to the hardware.
++       * The pfifo qdiscs will be attached to the netdev queues and will
++       * guide the traffic from the IP stack down to the driver with minimum
++       * interference.
++       *
++       * The CEETM qdiscs and classes will be crossed when the traffic
++       * reaches the driver.
++       */
 +      priv->root.qdiscs = kcalloc(dev->num_tx_queues,
 +                                  sizeof(priv->root.qdiscs[0]),
 +                                  GFP_KERNEL);
@@ -4663,6 +4763,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +      priv->shaped = parent_cl->shaped;
 +      priv->prio.qcount = qopt->qcount;
++      priv->prio.ch = parent_cl->ch;
 +
 +      /* Create and configure qcount child classes */
 +      for (i = 0; i < priv->prio.qcount; i++) {
@@ -4688,6 +4789,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              child_cl->type = CEETM_PRIO;
 +              child_cl->shaped = priv->shaped;
 +              child_cl->prio.child = NULL;
++              child_cl->ch = priv->prio.ch;
 +
 +              /* All shaped CQs have CR and ER enabled by default */
 +              child_cl->prio.cr = child_cl->shaped;
@@ -4696,8 +4798,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              child_cl->prio.cq = NULL;
 +
 +              /* Configure the corresponding hardware CQ */
-+              err = ceetm_config_prio_cls(child_cl, dev,
-+                                          parent_cl->root.ch, i);
++              err = ceetm_config_prio_cls(child_cl, dev, i);
 +              if (err) {
 +                      pr_err(KBUILD_BASENAME " : %s : failed to configure the ceetm prio class %X\n",
 +                             __func__, child_cl->common.classid);
@@ -4729,7 +4830,6 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      struct ceetm_class *parent_cl, *child_cl, *root_cl;
 +      struct Qdisc *parent_qdisc;
 +      struct ceetm_qdisc *parent_priv;
-+      struct qm_ceetm_channel *channel;
 +      struct net_device *dev = qdisc_dev(sch);
 +
 +      pr_debug(KBUILD_BASENAME " : %s : qdisc %X\n", __func__, sch->handle);
@@ -4802,8 +4902,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      priv->wbfs.qcount = qopt->qcount;
 +      priv->wbfs.cr = qopt->cr;
 +      priv->wbfs.er = qopt->er;
-+
-+      channel = root_cl->root.ch;
++      priv->wbfs.ch = parent_cl->ch;
 +
 +      /* Configure the hardware wbfs channel groups */
 +      if (priv->wbfs.qcount == CEETM_MAX_WBFS_QCOUNT) {
@@ -4818,7 +4917,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              /* Configure the group B */
 +              priv->wbfs.group_type = WBFS_GRP_B;
 +
-+              err = qman_ceetm_channel_get_group(channel, &small_group,
++              err = qman_ceetm_channel_get_group(priv->wbfs.ch, &small_group,
 +                                                 &prio_a, &prio_b);
 +              if (err) {
 +                      pr_err(KBUILD_BASENAME " : %s : failed to get group details\n",
@@ -4836,7 +4935,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              /* Configure the small group A */
 +              priv->wbfs.group_type = WBFS_GRP_A;
 +
-+              err = qman_ceetm_channel_get_group(channel, &small_group,
++              err = qman_ceetm_channel_get_group(priv->wbfs.ch, &small_group,
 +                                                 &prio_a, &prio_b);
 +              if (err) {
 +                      pr_err(KBUILD_BASENAME " : %s : failed to get group details\n",
@@ -4851,13 +4950,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              prio_b = prio_b ? : prio_a;
 +      }
 +
-+      err = qman_ceetm_channel_set_group(channel, small_group, prio_a,
++      err = qman_ceetm_channel_set_group(priv->wbfs.ch, small_group, prio_a,
 +                                         prio_b);
 +      if (err)
 +              goto err_init_wbfs;
 +
 +      if (priv->shaped) {
-+              err = qman_ceetm_channel_set_group_cr_eligibility(channel,
++              err = qman_ceetm_channel_set_group_cr_eligibility(priv->wbfs.ch,
 +                                                                group_b,
 +                                                              priv->wbfs.cr);
 +              if (err) {
@@ -4866,7 +4965,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      goto err_init_wbfs;
 +              }
 +
-+              err = qman_ceetm_channel_set_group_er_eligibility(channel,
++              err = qman_ceetm_channel_set_group_er_eligibility(priv->wbfs.ch,
 +                                                                group_b,
 +                                                              priv->wbfs.er);
 +              if (err) {
@@ -4902,13 +5001,14 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              child_cl->wbfs.fq = NULL;
 +              child_cl->wbfs.cq = NULL;
 +              child_cl->wbfs.weight = qopt->qweight[i];
++              child_cl->ch = priv->wbfs.ch;
 +
 +              if (priv->wbfs.group_type == WBFS_GRP_B)
 +                      id = WBFS_GRP_B_OFFSET + i;
 +              else
 +                      id = WBFS_GRP_A_OFFSET + i;
 +
-+              err = ceetm_config_wbfs_cls(child_cl, dev, channel, id,
++              err = ceetm_config_wbfs_cls(child_cl, dev, id,
 +                                          priv->wbfs.group_type);
 +              if (err) {
 +                      pr_err(KBUILD_BASENAME " : %s : failed to configure the ceetm wbfs class %X\n",
@@ -4994,7 +5094,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +      switch (priv->type) {
 +      case CEETM_ROOT:
++              netif_tx_stop_all_queues(dev);
++              dpaa_drain_fqs(dev);
 +              ret = ceetm_init_root(sch, priv, qopt);
++              netif_tx_wake_all_queues(dev);
 +              break;
 +      case CEETM_PRIO:
 +              ret = ceetm_init_prio(sch, priv, qopt);
@@ -5070,9 +5173,6 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +{
 +      int err;
 +      bool group_b;
-+      struct qm_ceetm_channel *channel;
-+      struct ceetm_class *prio_class, *root_class;
-+      struct ceetm_qdisc *prio_qdisc;
 +
 +      if (qopt->qcount) {
 +              pr_err("CEETM: the qcount can not be modified\n");
@@ -5098,14 +5198,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      if (!priv->shaped)
 +              return 0;
 +
-+      prio_class = priv->wbfs.parent;
-+      prio_qdisc = qdisc_priv(prio_class->parent);
-+      root_class = prio_qdisc->prio.parent;
-+      channel = root_class->root.ch;
 +      group_b = priv->wbfs.group_type == WBFS_GRP_B;
 +
 +      if (qopt->cr != priv->wbfs.cr) {
-+              err = qman_ceetm_channel_set_group_cr_eligibility(channel,
++              err = qman_ceetm_channel_set_group_cr_eligibility(priv->wbfs.ch,
 +                                                                group_b,
 +                                                                qopt->cr);
 +              if (err)
@@ -5114,7 +5210,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      }
 +
 +      if (qopt->er != priv->wbfs.er) {
-+              err = qman_ceetm_channel_set_group_er_eligibility(channel,
++              err = qman_ceetm_channel_set_group_er_eligibility(priv->wbfs.ch,
 +                                                                group_b,
 +                                                                qopt->er);
 +              if (err)
@@ -5184,7 +5280,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      return ret;
 +}
 +
-+/* Attach the underlying pfifo qdiscs */
++/* Graft the underlying pfifo qdiscs to the netdev queues.
++ * It's safe to remove our references at this point, since the kernel will
++ * destroy the qdiscs on its own and no cleanup from our part is required.
++ */
 +static void ceetm_attach(struct Qdisc *sch)
 +{
 +      struct net_device *dev = qdisc_dev(sch);
@@ -5200,6 +5299,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              if (old_qdisc)
 +                      qdisc_destroy(old_qdisc);
 +      }
++
++      kfree(priv->root.qdiscs);
++      priv->root.qdiscs = NULL;
 +}
 +
 +static unsigned long ceetm_cls_get(struct Qdisc *sch, u32 classid)
@@ -5242,7 +5344,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +      if (cl->shaped && cl->root.rate != copt->rate) {
 +              bps = copt->rate << 3; /* Bps -> bps */
-+              err = qman_ceetm_channel_set_commit_rate_bps(cl->root.ch, bps,
++              err = qman_ceetm_channel_set_commit_rate_bps(cl->ch, bps,
 +                                                           dev->mtu);
 +              if (err)
 +                      goto change_cls_err;
@@ -5251,7 +5353,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +      if (cl->shaped && cl->root.ceil != copt->ceil) {
 +              bps = copt->ceil << 3; /* Bps -> bps */
-+              err = qman_ceetm_channel_set_excess_rate_bps(cl->root.ch, bps,
++              err = qman_ceetm_channel_set_excess_rate_bps(cl->ch, bps,
 +                                                           dev->mtu);
 +              if (err)
 +                      goto change_cls_err;
@@ -5259,7 +5361,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      }
 +
 +      if (!cl->shaped && cl->root.tbl != copt->tbl) {
-+              err = qman_ceetm_channel_set_weight(cl->root.ch, copt->tbl);
++              err = qman_ceetm_channel_set_weight(cl->ch, copt->tbl);
 +              if (err)
 +                      goto change_cls_err;
 +              cl->root.tbl = copt->tbl;
@@ -5454,7 +5556,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              goto claim_err;
 +      }
 +
-+      cl->root.ch = channel;
++      cl->ch = channel;
 +
 +      if (cl->shaped) {
 +              /* Configure the channel shaper */
@@ -5924,7 +6026,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +module_exit(ceetm_unregister);
 --- /dev/null
 +++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_ceetm.h
-@@ -0,0 +1,238 @@
+@@ -0,0 +1,240 @@
 +/* Copyright 2008-2016 Freescale Semiconductor Inc.
 + *
 + * Redistribution and use in source and binary forms, with or without
@@ -6048,12 +6150,14 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +struct prio_q {
 +      __u16 qcount;
 +      struct ceetm_class *parent;
++      struct qm_ceetm_channel *ch;
 +};
 +
 +struct wbfs_q {
 +      __u16 qcount;
 +      int group_type;
 +      struct ceetm_class *parent;
++      struct qm_ceetm_channel *ch;
 +      __u16 cr;
 +      __u16 er;
 +};
@@ -6091,7 +6195,6 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      bool wbfs_grp_b;
 +      bool wbfs_grp_large;
 +      struct Qdisc *child;
-+      struct qm_ceetm_channel *ch;
 +};
 +
 +struct prio_c {
@@ -6120,6 +6223,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      int refcnt; /* usage count of this class */
 +      struct tcf_proto *filter_list; /* class attached filters */
 +      struct Qdisc *parent;
++      struct qm_ceetm_channel *ch;
 +      bool shaped;
 +      int type; /* ROOT/PRIO/WBFS */
 +      union {
@@ -8582,7 +8686,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +module_exit(dpa_proxy_unload);
 --- /dev/null
 +++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_sg.c
-@@ -0,0 +1,1168 @@
+@@ -0,0 +1,1193 @@
 +/* Copyright 2012 Freescale Semiconductor Inc.
 + *
 + * Redistribution and use in source and binary forms, with or without
@@ -8706,6 +8810,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      put_page(virt_to_head_page(new_buf));
 +                      goto build_skb_failed;
 +              }
++
++              /* Store the skb back-pointer before the start of the buffer.
++               * Otherwise it will be overwritten by the FMan.
++               */
 +              DPA_WRITE_SKB_PTR(skb, skbh, new_buf, -1);
 +
 +              addr = dma_map_single(dev, new_buf,
@@ -8929,13 +9037,22 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +       * - buffer address aligned to cacheline bytes
 +       * - offset of data from start of buffer no lower than a minimum value
 +       * - offset of data from start of buffer no higher than a maximum value
++       * - the skb back-pointer is stored safely
 +       */
++
++      /* guarantee both the minimum size and the minimum data offset */
 +      new = min(skb_end_pointer(skb) - min_size, skb->data - min_offset);
 +
 +      /* left align to the nearest cacheline */
 +      new = (unsigned char *)((unsigned long)new & ~(SMP_CACHE_BYTES - 1));
 +
-+      if (likely(new >= skb->head &&
++      /* Make sure there is enough space to store the skb back-pointer in
++       * the headroom, right before the start of the buffer.
++       *
++       * Guarantee that both maximum size and maximum data offsets aren't
++       * crossed.
++       */
++      if (likely(new >= (skb->head + sizeof(void *)) &&
 +                 new >= (skb->data - DPA_MAX_FD_OFFSET) &&
 +                 skb_end_pointer(skb) - new <= DPA_RECYCLE_MAX_SIZE)) {
 +              *new_buf_start = new;
@@ -9273,6 +9390,9 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              dma_dir = DMA_BIDIRECTIONAL;
 +              dma_map_size = dpa_bp->size;
 +
++              /* Store the skb back-pointer before the start of the buffer.
++               * Otherwise it will be overwritten by the FMan.
++               */
 +              DPA_WRITE_SKB_PTR(skb, skbh, buffer_start, -1);
 +              *offset = skb_headroom(skb) - fd->offset;
 +      } else
@@ -9290,7 +9410,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +              /* The buffer will be Tx-confirmed, but the TxConf cb must
 +               * necessarily look at our Tx private data to retrieve the
-+               * skbuff. (In short: can't use DPA_WRITE_SKB_PTR() here.)
++               * skbuff. Store the back-pointer inside the buffer.
 +               */
 +              DPA_WRITE_SKB_PTR(skb, skbh, buffer_start, 0);
 +      }
@@ -9554,7 +9674,11 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      fd->length20 = skb->len;
 +      fd->offset = priv->tx_headroom;
 +
-+      /* DMA map the SGT page */
++      /* DMA map the SGT page
++       *
++       * It's safe to store the skb back-pointer inside the buffer since
++       * S/G frames are non-recyclable.
++       */
 +      DPA_WRITE_SKB_PTR(skb, skbh, sgt_buf, 0);
 +      addr = dma_map_single(dpa_bp->dev, sgt_buf,
 +                            priv->tx_headroom + sgt_size,
@@ -9678,6 +9802,11 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                              percpu_stats->tx_errors++;
 +                              return NETDEV_TX_OK;
 +                      }
++
++                      /* propagate the skb ownership information */
++                      if (skb->sk)
++                              skb_set_owner_w(skb_new, skb->sk);
++
 +                      dev_kfree_skb(skb);
 +                      skb = skb_new;
 +              }
@@ -11022,7 +11151,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +module_exit(dpa_ptp_unload);
 --- /dev/null
 +++ b/drivers/net/ethernet/freescale/sdk_dpaa/mac-api.c
-@@ -0,0 +1,907 @@
+@@ -0,0 +1,931 @@
 +/* Copyright 2008-2012 Freescale Semiconductor, Inc.
 + *
 + * Redistribution and use in source and binary forms, with or without
@@ -11527,17 +11656,41 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                        struct mac_device *mac_dev)
 +{
 +      struct phy_device       *phy_dev;
++      void (*adjust_link_handler)(struct net_device *);
 +
 +      if ((macdev2enetinterface(mac_dev) == e_ENET_MODE_XGMII_10000) ||
-+          (macdev2enetinterface(mac_dev) == e_ENET_MODE_SGMII_2500) ||
-+          of_phy_is_fixed_link(mac_dev->phy_node)) {
-+              phy_dev = of_phy_connect(net_dev, mac_dev->phy_node,
-+                                       &adjust_link_void, 0,
-+                                       mac_dev->phy_if);
++          (macdev2enetinterface(mac_dev) == e_ENET_MODE_SGMII_2500)) {
++              /* Pass a void link state handler to the PHY state machine
++               * for XGMII (10G) and SGMII 2.5G, as the hardware does not
++               * permit dynamic link speed adjustments. */
++              adjust_link_handler = adjust_link_void;
++      } else if (macdev2enetinterface(mac_dev) & e_ENET_IF_RGMII) {
++              /* Regular RGMII ports connected to a PHY, as well as
++               * ports that are marked as "fixed-link" in the DTS,
++               * will have the adjust_link callback. This calls
++               * fman_memac_adjust_link in order to configure the
++               * IF_MODE register, which is needed in both cases.
++               */
++              adjust_link_handler = adjust_link;
++      } else if (of_phy_is_fixed_link(mac_dev->phy_node)) {
++              /* Pass a void link state handler for fixed-link
++               * interfaces that are not RGMII. Only RGMII has been
++               * tested and confirmed to work with fixed-link. Other
++               * MII interfaces may need further work.
++               * TODO: Change this as needed.
++               */
++              adjust_link_handler = adjust_link_void;
 +      } else {
-+              phy_dev = of_phy_connect(net_dev, mac_dev->phy_node,
-+                                       &adjust_link, 0, mac_dev->phy_if);
++              /* MII, RMII, SMII, GMII, SGMII, BASEX ports,
++               * that are NOT fixed-link.
++               * TODO: May not be needed for interfaces that
++               * pass through the SerDes block (*SGMII, XFI).
++               */
++              adjust_link_handler = adjust_link;
 +      }
++      phy_dev = of_phy_connect(net_dev, mac_dev->phy_node,
++                               adjust_link_handler, 0,
++                               mac_dev->phy_if);
 +
 +      if (unlikely(phy_dev == NULL) || IS_ERR(phy_dev)) {
 +              netdev_err(net_dev, "Could not connect to PHY %s\n",
@@ -12068,10 +12221,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +static const struct of_device_id mac_match[] = {
 +      [DTSEC] = {
-+              .compatible     = "fsl,fman-1g-mac"
++              .compatible     = "fsl,fman-dtsec"
 +      },
 +      [XGMAC] = {
-+              .compatible     = "fsl,fman-10g-mac"
++              .compatible     = "fsl,fman-xgec"
 +      },
 +      [MEMAC] = {
 +              .compatible     = "fsl,fman-memac"
@@ -14929,7 +15082,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 --- /dev/null
 +++ b/drivers/net/ethernet/freescale/sdk_fman/Peripherals/FM/MAC/dtsec.c
-@@ -0,0 +1,1465 @@
+@@ -0,0 +1,1504 @@
 +/*
 + * Copyright 2008-2013 Freescale Semiconductor Inc.
 + *
@@ -15318,6 +15471,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +static t_Error GracefulStop(t_Dtsec *p_Dtsec, e_CommMode mode)
 +{
 +    struct dtsec_regs *p_MemMap;
++    int pollTimeout = 0;
 +
 +    ASSERT_COND(p_Dtsec);
 +
@@ -15340,16 +15494,32 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +    }
 +
 +    if (mode & e_COMM_MODE_TX)
-+#if defined(FM_GTS_ERRATA_DTSEC_A004) || defined(FM_GTS_AFTER_MAC_ABORTED_FRAME_ERRATA_DTSEC_A0012)
-+    if (p_Dtsec->fmMacControllerDriver.fmRevInfo.majorRev == 2)
-+        DBG(INFO, ("GTS not supported due to DTSEC_A004 errata."));
-+#else  /* not defined(FM_GTS_ERRATA_DTSEC_A004) ||... */
-+#ifdef FM_GTS_UNDERRUN_ERRATA_DTSEC_A0014
-+        DBG(INFO, ("GTS not supported due to DTSEC_A0014 errata."));
-+#else  /* FM_GTS_UNDERRUN_ERRATA_DTSEC_A0014 */
++    {
++#if defined(FM_GTS_ERRATA_DTSEC_A004)
++        if (p_Dtsec->fmMacControllerDriver.fmRevInfo.majorRev == 2)
++            DBG(INFO, ("GTS not supported due to DTSEC_A004 errata."));
++#else  /* not defined(FM_GTS_ERRATA_DTSEC_A004) */
++
 +        fman_dtsec_stop_tx(p_MemMap);
-+#endif /* FM_GTS_UNDERRUN_ERRATA_DTSEC_A0014 */
-+#endif /* defined(FM_GTS_ERRATA_DTSEC_A004) ||...  */
++
++#if defined(FM_GTS_UNDERRUN_ERRATA_DTSEC_A0014) || defined(FM_GTS_AFTER_MAC_ABORTED_FRAME_ERRATA_DTSEC_A0012)
++        XX_UDelay(10);
++#endif /* FM_GTS_UNDERRUN_ERRATA_DTSEC_A0014 || FM_GTS_AFTER_MAC_ABORTED_FRAME_ERRATA_DTSEC_A0012 */
++#endif /* defined(FM_GTS_ERRATA_DTSEC_A004) */
++    }
++
++    /* Poll GRSC/GTSC bits in IEVENT register until both are set */
++#if defined(FM_GRS_ERRATA_DTSEC_A002) || defined(FM_GTS_ERRATA_DTSEC_A004) || defined(FM_GTS_AFTER_MAC_ABORTED_FRAME_ERRATA_DTSEC_A0012) || defined(FM_GTS_UNDERRUN_ERRATA_DTSEC_A0014) || defined(FM_GTS_AFTER_DROPPED_FRAME_ERRATA_DTSEC_A004839)
++    XX_UDelay(10);
++#else
++    while (fman_dtsec_get_event(p_MemMap, DTSEC_IMASK_GRSCEN | DTSEC_IMASK_GTSCEN) != (DTSEC_IMASK_GRSCEN | DTSEC_IMASK_GTSCEN))
++    {
++        if (pollTimeout == 100)
++            break;
++        XX_UDelay(1);
++        pollTimeout++;
++    }
++#endif
 +
 +    return E_OK;
 +}
@@ -15564,7 +15734,12 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      " value should be greater than 320."));
 +#endif /* FM_BAD_TX_TS_IN_B_2_B_ERRATA_DTSEC_A003 */
 +
++    GracefulStop(p_Dtsec, e_COMM_MODE_RX_AND_TX);
++
 +    fman_dtsec_set_tx_pause_frames(p_Dtsec->p_MemMap, pauseTime);
++
++    GracefulRestart(p_Dtsec, e_COMM_MODE_RX_AND_TX);
++
 +    return E_OK;
 +}
 +
@@ -15585,8 +15760,12 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +    SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_STATE);
 +    SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
 +
++    GracefulStop(p_Dtsec, e_COMM_MODE_RX_AND_TX);
++
 +    fman_dtsec_handle_rx_pause(p_Dtsec->p_MemMap, accept_pause);
 +
++    GracefulRestart(p_Dtsec, e_COMM_MODE_RX_AND_TX);
++
 +    return E_OK;
 +}
 +
@@ -15719,8 +15898,13 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +    /* Initialize MAC Station Address registers (1 & 2)    */
 +    /* Station address have to be swapped (big endian to little endian */
 +    p_Dtsec->addr = ENET_ADDR_TO_UINT64(*p_EnetAddr);
++
++    GracefulStop(p_Dtsec, e_COMM_MODE_RX_AND_TX);
++
 +    fman_dtsec_set_mac_address(p_Dtsec->p_MemMap, (uint8_t *)(*p_EnetAddr));
 +
++    GracefulRestart(p_Dtsec, e_COMM_MODE_RX_AND_TX);
++
 +    return E_OK;
 +}
 +
@@ -16008,8 +16192,12 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +    SANITY_CHECK_RETURN_ERROR(p_Dtsec, E_INVALID_STATE);
 +    SANITY_CHECK_RETURN_ERROR(!p_Dtsec->p_DtsecDriverParam, E_INVALID_STATE);
 +
++    GracefulStop(p_Dtsec, e_COMM_MODE_RX_AND_TX);
++
 +    fman_dtsec_set_wol(p_Dtsec->p_MemMap, en);
 +
++    GracefulRestart(p_Dtsec, e_COMM_MODE_RX_AND_TX);
++
 +    return E_OK;
 +}
 +
@@ -16030,11 +16218,15 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +    enet_speed = (enum enet_speed) ENET_SPEED_FROM_MODE(p_Dtsec->enetMode);
 +    p_Dtsec->halfDuplex = !fullDuplex;
 +
++    GracefulStop(p_Dtsec, e_COMM_MODE_RX_AND_TX);
++
 +    err = fman_dtsec_adjust_link(p_Dtsec->p_MemMap, enet_interface, enet_speed, fullDuplex);
 +
 +    if (err == -EINVAL)
 +        RETURN_ERROR(MAJOR, E_CONFLICT, ("Ethernet interface does not support Half Duplex mode"));
 +
++    GracefulRestart(p_Dtsec, e_COMM_MODE_RX_AND_TX);
++
 +    return (t_Error)err;
 +}
 +
@@ -109906,7 +110098,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#endif /* __LNXWRP_FM_H__ */
 --- /dev/null
 +++ b/drivers/net/ethernet/freescale/sdk_fman/src/wrapper/lnxwrp_fm_port.c
-@@ -0,0 +1,1480 @@
+@@ -0,0 +1,1512 @@
 +/*
 + * Copyright 2008-2012 Freescale Semiconductor Inc.
 + *
@@ -110212,7 +110404,21 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      tmp_prop = be32_to_cpu(*uint32_prop);
 +      if (WARN_ON(lenp != sizeof(uint32_t)))
 +              return NULL;
-+      if (of_device_is_compatible(port_node, "fsl,fman-port-oh")) {
++      if (of_device_is_compatible(port_node, "fsl,fman-port-oh") ||
++          of_device_is_compatible(port_node, "fsl,fman-v2-port-oh") ||
++          of_device_is_compatible(port_node, "fsl,fman-v3-port-oh")) {
++#ifndef CONFIG_FMAN_ARM
++#ifdef CONFIG_FMAN_P3040_P4080_P5020
++              /* On PPC FMan v2, OH ports start from cell-index 0x1 */
++              tmp_prop -= 0x1;
++#else
++              /* On PPC FMan v3 (Low and High), OH ports start from
++               * cell-index 0x2
++               */
++              tmp_prop -= 0x2;
++#endif // CONFIG_FMAN_P3040_P4080_P5020
++#endif // CONFIG_FMAN_ARM
++
 +              if (unlikely(tmp_prop >= FM_MAX_NUM_OF_OH_PORTS)) {
 +                      REPORT_ERROR(MAJOR, E_INVALID_VALUE,
 +                                   ("of_get_property(%s, cell-index) failed",
@@ -110297,7 +110503,14 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      settings.param.specificParams.nonRxParams.qmChannel =
 +                      p_LnxWrpFmPortDev->txCh;
 +      } else if (of_device_is_compatible(port_node, "fsl,fman-port-10g-tx")) {
++#ifndef CONFIG_FMAN_ARM
++              /* On T102x, the 10G TX port IDs start from 0x28 */
++              if (IS_T1023_T1024)
++                      tmp_prop -= 0x28;
++              else
++#endif
 +              tmp_prop -= 0x30;
++
 +              if (unlikely(tmp_prop>= FM_MAX_NUM_OF_10G_TX_PORTS)) {
 +                      REPORT_ERROR(MAJOR, E_INVALID_VALUE,
 +                                      ("of_get_property(%s, cell-index) failed",
@@ -110308,7 +110521,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                      FM_MAX_NUM_OF_1G_TX_PORTS];
 +#ifndef CONFIG_FMAN_ARM
 +              if (IS_T1023_T1024)
-+                      p_LnxWrpFmPortDev = &p_LnxWrpFmDev->txPorts[*uint32_prop];
++                      p_LnxWrpFmPortDev = &p_LnxWrpFmDev->txPorts[tmp_prop];
 +#endif
 +
 +              p_LnxWrpFmPortDev->id = tmp_prop;
@@ -110346,7 +110559,14 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +              if (p_LnxWrpFmDev->pcdActive)
 +                      p_LnxWrpFmPortDev->defPcd = p_LnxWrpFmDev->defPcd;
 +      } else if (of_device_is_compatible(port_node, "fsl,fman-port-10g-rx")) {
++#ifndef CONFIG_FMAN_ARM
++              /* On T102x, the 10G RX port IDs start from 0x08 */
++              if (IS_T1023_T1024)
++                      tmp_prop -= 0x8;
++              else
++#endif
 +              tmp_prop -= 0x10;
++
 +              if (unlikely(tmp_prop >= FM_MAX_NUM_OF_10G_RX_PORTS)) {
 +                      REPORT_ERROR(MAJOR, E_INVALID_VALUE,
 +                                      ("of_get_property(%s, cell-index) failed",
@@ -110358,7 +110578,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +
 +#ifndef CONFIG_FMAN_ARM
 +              if (IS_T1023_T1024)
-+                      p_LnxWrpFmPortDev = &p_LnxWrpFmDev->rxPorts[*uint32_prop];
++                      p_LnxWrpFmPortDev = &p_LnxWrpFmDev->rxPorts[tmp_prop];
 +#endif
 +
 +              p_LnxWrpFmPortDev->id = tmp_prop;
@@ -110546,7 +110766,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +    uint32_prop = (uint32_t *)of_get_property(port_node, "ar-tables-sizes",
 +      &lenp);
 +    if (uint32_prop) {
-+    
++
 +      if (WARN_ON(lenp != sizeof(uint32_t)*8))
 +            RETURN_ERROR(MINOR, E_INVALID_VALUE, NO_MSG);
 +      if (WARN_ON(p_LnxWrpFmPortDev->settings.param.portType !=
@@ -110580,7 +110800,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +        if (uint32_prop) {
 +              if (WARN_ON(lenp != sizeof(uint32_t)*3))
 +                RETURN_ERROR(MINOR, E_INVALID_VALUE, NO_MSG);
-+         
++
 +            p_LnxWrpFmPortDev->dsar_table_sizes.max_num_of_ip_prot_filtering  =
 +              (uint16_t)be32_to_cpu(uint32_prop[0]);
 +            p_LnxWrpFmPortDev->dsar_table_sizes.max_num_of_tcp_port_filtering =
@@ -110588,7 +110808,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +            p_LnxWrpFmPortDev->dsar_table_sizes.max_num_of_udp_port_filtering =
 +              (uint16_t)be32_to_cpu(uint32_prop[2]);
 +        }
-+        
++
 +        if ((err = FM_PORT_ConfigDsarSupport(p_LnxWrpFmPortDev->h_Dev,
 +              (t_FmPortDsarTablesSizes*)&p_LnxWrpFmPortDev->dsar_table_sizes)) != E_OK)
 +              RETURN_ERROR(MINOR, err, NO_MSG);
@@ -111328,6 +111548,10 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      {
 +       .compatible = "fsl,fman-port-oh"},
 +      {
++       .compatible = "fsl,fman-v2-port-oh"},
++      {
++       .compatible = "fsl,fman-v3-port-oh"},
++      {
 +       .compatible = "fsl,fman-port-1g-rx"},
 +      {
 +       .compatible = "fsl,fman-port-10g-rx"},
@@ -135739,7 +135963,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#endif
 --- /dev/null
 +++ b/drivers/staging/fsl_qbman/qman_high.c
-@@ -0,0 +1,5669 @@
+@@ -0,0 +1,5652 @@
 +/* Copyright 2008-2012 Freescale Semiconductor, Inc.
 + *
 + * Redistribution and use in source and binary forms, with or without
@@ -138817,36 +139041,19 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +      struct completion completion;
 +};
 +
-+static int qman_delete_cgr_thread(void *p)
++static void qman_delete_cgr_smp_call(void *p)
 +{
-+      struct cgr_comp *cgr_comp = (struct cgr_comp *)p;
-+      int res;
-+
-+      res = qman_delete_cgr((struct qman_cgr *)cgr_comp->cgr);
-+      complete(&cgr_comp->completion);
-+
-+      return res;
++      qman_delete_cgr((struct qman_cgr *)p);
 +}
 +
 +void qman_delete_cgr_safe(struct qman_cgr *cgr)
 +{
-+      struct task_struct *thread;
-+      struct cgr_comp cgr_comp;
-+
 +      preempt_disable();
 +      if (qman_cgr_cpus[cgr->cgrid] != smp_processor_id()) {
-+              init_completion(&cgr_comp.completion);
-+              cgr_comp.cgr = cgr;
-+              thread = kthread_create(qman_delete_cgr_thread, &cgr_comp,
-+                                      "cgr_del");
-+
-+              if (likely(!IS_ERR(thread))) {
-+                      kthread_bind(thread, qman_cgr_cpus[cgr->cgrid]);
-+                      wake_up_process(thread);
-+                      wait_for_completion(&cgr_comp.completion);
-+                      preempt_enable();
-+                      return;
-+              }
++              smp_call_function_single(qman_cgr_cpus[cgr->cgrid],
++                                       qman_delete_cgr_smp_call, cgr, true);
++              preempt_enable();
++              return;
 +      }
 +      qman_delete_cgr(cgr);
 +      preempt_enable();
@@ -144756,7 +144963,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +#endif /* FSL_BMAN_H */
 --- /dev/null
 +++ b/include/linux/fsl_qman.h
-@@ -0,0 +1,3888 @@
+@@ -0,0 +1,3900 @@
 +/* Copyright 2008-2012 Freescale Semiconductor, Inc.
 + *
 + * Redistribution and use in source and binary forms, with or without
@@ -148572,6 +148779,18 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
 +                         struct qm_mcr_ceetm_lfqmt_query *lfqmt_query);
 +
 +/**
++ * qman_ceetm_query_cq - Queries a CEETM CQ
++ * @cqid: the channel ID (first byte) followed by the CQ idx
++ * @dcpid: CEETM portal ID
++ * @cq_query: storage for the queried CQ fields
++ *
++ * Returns zero for success or -EIO if the query command returns error.
++ *
++*/
++int qman_ceetm_query_cq(unsigned int cqid, unsigned int dcpid,
++                      struct qm_mcr_ceetm_cq_query *cq_query);
++
++/**
 + * qman_ceetm_query_write_statistics - Query (and optionally write) statistics
 + * @cid: Target ID (CQID or CCGRID)
 + * @dcp_idx: CEETM portal ID