diff options
author | Andy Fleming <afleming@freescale.com> | 2013-07-31 23:56:25 (GMT) |
---|---|---|
committer | Andy Fleming <afleming@freescale.com> | 2013-07-31 23:56:25 (GMT) |
commit | a4460591eff829d4805dfe2bdf43c041899ad4f2 (patch) | |
tree | 11c6ba968c1bf12845e34edeb6367bea9de57feb /drivers | |
parent | 8db1e318905a970d3291305581021f3f9225db9b (diff) | |
parent | a8d022f84c57846be4b39ff740f86c8454c78b52 (diff) | |
download | linux-fsl-qoriq-a4460591eff829d4805dfe2bdf43c041899ad4f2.tar.xz |
Merge remote-tracking branch 'fsl_devel/sdk-kernel-3.8' into sdk1.5
Diffstat (limited to 'drivers')
20 files changed, 152 insertions, 70 deletions
diff --git a/drivers/crypto/caam/desc.h b/drivers/crypto/caam/desc.h index 53b296f..7ddc851 100644 --- a/drivers/crypto/caam/desc.h +++ b/drivers/crypto/caam/desc.h @@ -463,6 +463,7 @@ struct sec4_sg_entry { #define OP_PCL_IPSEC_DES_IV64 0x0100 #define OP_PCL_IPSEC_DES 0x0200 #define OP_PCL_IPSEC_3DES 0x0300 +#define OP_PCL_IPSEC_NULL_ENC 0x0b00 #define OP_PCL_IPSEC_AES_CBC 0x0c00 #define OP_PCL_IPSEC_AES_CTR 0x0d00 #define OP_PCL_IPSEC_AES_XTS 0x1600 diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.c b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.c index 6b92941..b2dbcac 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.c +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Port/fm_port.c @@ -2444,6 +2444,17 @@ t_Handle FM_PORT_Config(t_FmPortParams *p_FmPortParams) } } +#ifdef FM_HEAVY_TRAFFIC_SEQUENCER_HANG_ERRATA_FMAN_A006981 + if ((p_FmPort->fmRevInfo.majorRev == 6) && + (p_FmPort->fmRevInfo.minorRev == 0) && + ((p_FmPort->portType == e_FM_PORT_TYPE_OH_OFFLINE_PARSING) || + (p_FmPort->portType == e_FM_PORT_TYPE_TX))) + { + p_FmPort->openDmas.num = 16; + p_FmPort->openDmas.extra = 0; + } +#endif /* FM_HEAVY_TRAFFIC_SEQUENCER_HANG_ERRATA_FMAN_A006981 */ + if (p_FmPort->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND) p_FmPort->p_FmPortDriverParam->syncReq = DEFAULT_PORT_syncReqForHc; else diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/fm.c b/drivers/net/ethernet/freescale/fman/Peripherals/FM/fm.c index 2fdc4c8..a44bdab 100644 --- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/fm.c +++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/fm.c @@ -3313,6 +3313,10 @@ t_Error FmSetNumOfOpenDmas(t_Handle h_Fm, p_Fm->p_FmStateStruct->fmId)); #else if ((p_Fm->p_FmStateStruct->revInfo.majorRev >= 6) && +#ifdef FM_HEAVY_TRAFFIC_SEQUENCER_HANG_ERRATA_FMAN_A006981 + !((p_Fm->p_FmStateStruct->revInfo.majorRev == 6) && + (p_Fm->p_FmStateStruct->revInfo.minorRev == 0)) && +#endif /* FM_HEAVY_TRAFFIC_SEQUENCER_HANG_ERRATA_FMAN_A006981 */ (p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas - oldVal + numOfOpenDmas > DMA_THRESH_MAX_COMMQ + 1)) RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("Requested numOfOpenDmas for fm%d exceeds DMA Command queue (%d)", diff --git a/drivers/net/ethernet/freescale/fman/inc/Peripherals/fm_pcd_ext.h b/drivers/net/ethernet/freescale/fman/inc/Peripherals/fm_pcd_ext.h index 60edfd2..e2199e4 100644 --- a/drivers/net/ethernet/freescale/fman/inc/Peripherals/fm_pcd_ext.h +++ b/drivers/net/ethernet/freescale/fman/inc/Peripherals/fm_pcd_ext.h @@ -99,16 +99,6 @@ #define FM_PCD_SW_PRS_SIZE 0x00000800 /**< Total size of SW parser area */ #define FM_PCD_PRS_SW_OFFSET 0x00000040 /**< Size of illegal addresses at the beginning of the SW parser area */ -#if (DPAA_VERSION >= 11) -#define FM_PCD_PRS_SW_PATCHES_SIZE 0x00000240 /**< Number of bytes saved for patches */ -#else -#define FM_PCD_PRS_SW_PATCHES_SIZE 0x00000200 /**< Number of bytes saved for patches */ -#endif /* (DPAA_VERSION >= 11) */ - -#define FM_PCD_PRS_SW_TAIL_SIZE 4 /**< Number of bytes that must be cleared at - the end of the SW parser area */ -#define FM_SW_PRS_MAX_IMAGE_SIZE (FM_PCD_SW_PRS_SIZE-FM_PCD_PRS_SW_OFFSET-FM_PCD_PRS_SW_TAIL_SIZE-FM_PCD_PRS_SW_PATCHES_SIZE) - /**< Maximum size of SW parser code */ #define FM_PCD_MAX_MANIP_INSRT_TEMPLATE_SIZE 128 /**< Maximum size of insertion template for insert manipulation */ diff --git a/drivers/net/ethernet/freescale/fman/inc/integrations/T4240/dpaa_integration_ext.h b/drivers/net/ethernet/freescale/fman/inc/integrations/T4240/dpaa_integration_ext.h index 83ae8ba..52ed8f8 100644 --- a/drivers/net/ethernet/freescale/fman/inc/integrations/T4240/dpaa_integration_ext.h +++ b/drivers/net/ethernet/freescale/fman/inc/integrations/T4240/dpaa_integration_ext.h @@ -261,6 +261,7 @@ typedef enum #define FM_WRONG_RESET_VALUES_ERRATA_FMAN_A005127 #define FM_RX_FIFO_CORRUPT_ERRATA_10GMAC_A006320 #define FM_OP_NO_VSP_NO_RELEASE_ERRATA_FMAN_A006675 +#define FM_HEAVY_TRAFFIC_SEQUENCER_HANG_ERRATA_FMAN_A006981 #define FM_BCB_ERRATA_BMI_SW001 #define FM_LEN_CHECK_ERRATA_FMAN_SW002 diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.h b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.h index d89327c..feab96f 100644 --- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.h +++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.h @@ -228,6 +228,7 @@ typedef struct { struct device_attribute *dev_pcd_attr_stats; struct device_attribute *dev_pcd_attr_regs; + struct device_attribute *dev_attr_muram_free_size; struct qman_fq *hc_tx_conf_fq, *hc_tx_err_fq, *hc_tx_fq; } t_LnxWrpFmDev; diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm.c b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm.c index f9a8e26..519c443 100644 --- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm.c +++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm.c @@ -124,18 +124,6 @@ #error Error: please synchronize IOC_ defines! #endif -#if CMP_IOC_DEFINE(FM_PCD_PRS_SW_PATCHES_SIZE) -#error Error: please synchronize IOC_ defines! -#endif - -#if CMP_IOC_DEFINE(FM_PCD_PRS_SW_TAIL_SIZE) -#error Error: please synchronize IOC_ defines! -#endif - -#if CMP_IOC_DEFINE(FM_SW_PRS_MAX_IMAGE_SIZE) -#error Error: please synchronize IOC_ defines! -#endif - #if CMP_IOC_DEFINE(FM_PCD_MAX_MANIP_INSRT_TEMPLATE_SIZE) #error Error: please synchronize IOC_ defines! #endif diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.c b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.c index 7e29867..68142b6 100644 --- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.c +++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.c @@ -909,8 +909,8 @@ void compat_copy_keys( #if (DPAA_VERSION >= 11) memcpy(¶m->frame_length_ranges, &compat_param->frame_length_ranges, - sizeof(param->frame_length_ranges[0] * - IOC_FM_PCD_CC_STATS_MAX_NUM_OF_FLR)); + sizeof(param->frame_length_ranges[0]) * + IOC_FM_PCD_CC_STATS_MAX_NUM_OF_FLR); #endif /* (DPAA_VERSION >= 11) */ } else { diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h index 288777a..f8655db 100644 --- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h +++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h @@ -52,7 +52,7 @@ /* mapping kernel pointers w/ UserSpace id's { */ /* Because compat_ptr(ptr_to_compat(X)) != X, this way we cannot exchange pointers back and forth (US - KS). compat_ptr is a cast and pointers are broken. */ -#define COMPAT_PTR2ID_ARRAY_MAX (256+1) /* first location is not used */ +#define COMPAT_PTR2ID_ARRAY_MAX (512+1) /* first location is not used */ #define COMPAT_PTR2ID_WATERMARK 0xface0000 #define COMPAT_PTR2ID_WM_MASK 0xffff0000 diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm.c b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm.c index 2cfc0b9..9237688 100644 --- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm.c +++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm.c @@ -308,6 +308,37 @@ static ssize_t show_fm_stats(struct device *dev, return n; } +static ssize_t show_fm_muram_free_size(struct device *dev, + struct device_attribute *attr, char *buf) +{ + t_LnxWrpFmDev *p_LnxWrpFmDev = NULL; + unsigned long flags = 0; + unsigned n = 0; + uint64_t muram_free_size = 0; + + if (attr == NULL || buf == NULL || dev == NULL) + return -EINVAL; + + p_LnxWrpFmDev = (t_LnxWrpFmDev *) dev_get_drvdata(dev); + if (WARN_ON(p_LnxWrpFmDev == NULL)) + return -EINVAL; + + if (!p_LnxWrpFmDev->active || !p_LnxWrpFmDev->h_Dev) + return -EIO; + + muram_free_size = FM_MURAM_GetFreeMemSize(p_LnxWrpFmDev->h_MuramDev); + + local_irq_save(flags); + + n = snprintf(buf, PAGE_SIZE, "\tFM %d muram_free_size: %lld\n", + p_LnxWrpFmDev->id, muram_free_size); + + local_irq_restore(flags); + + return n; +} + + static ssize_t show_fm_pcd_stats(struct device *dev, struct device_attribute *attr, char *buf) { @@ -530,6 +561,7 @@ static ssize_t show_pcd_regs(struct device *dev, static DEVICE_ATTR(fm_regs, S_IRUGO, show_fm_regs, NULL); static DEVICE_ATTR(fm_pcd_regs, S_IRUGO, show_pcd_regs, NULL); +static DEVICE_ATTR(fm_muram_free_size, S_IRUGO, show_fm_muram_free_size, NULL); int fm_sysfs_create(struct device *dev) { @@ -543,6 +575,7 @@ int fm_sysfs_create(struct device *dev) /* store to remove them when module is disabled */ p_LnxWrpFmDev->dev_attr_regs = &dev_attr_fm_regs; p_LnxWrpFmDev->dev_pcd_attr_regs = &dev_attr_fm_pcd_regs; + p_LnxWrpFmDev->dev_attr_muram_free_size = &dev_attr_fm_muram_free_size; /* Create sysfs statistics group for FM module */ if (sysfs_create_group(&dev->kobj, &fm_dev_stats_attr_grp) != 0) @@ -553,6 +586,10 @@ int fm_sysfs_create(struct device *dev) device_create_file(dev, &dev_attr_fm_pcd_regs) != 0) return -EIO; + /* muram free size */ + if (device_create_file(dev, &dev_attr_fm_muram_free_size) != 0 ) + return -EIO; + return 0; } @@ -570,4 +607,5 @@ void fm_sysfs_destroy(struct device *dev) sysfs_remove_group(&dev->kobj, &fm_dev_stats_attr_grp); device_remove_file(dev, p_LnxWrpFmDev->dev_attr_regs); device_remove_file(dev, p_LnxWrpFmDev->dev_pcd_attr_regs); + device_remove_file(dev, p_LnxWrpFmDev->dev_attr_muram_free_size); } diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm_port.c b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm_port.c index 97dacb7..cab44ef 100644 --- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm_port.c +++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm_port.c @@ -147,10 +147,9 @@ static ssize_t show_fm_port_stats(struct device *dev, } local_irq_save(flags); - n = snprintf(buf, PAGE_SIZE, "\tFM %d Port %d counter: %d\n", - p_LnxWrpFmDev->id, - p_LnxWrpFmPortDev->id, - FM_PORT_GetCounter(p_LnxWrpFmPortDev->h_Dev, + n = snprintf(buf, PAGE_SIZE, "\t%s counter: %d\n", + p_LnxWrpFmPortDev->name, + FM_PORT_GetCounter(p_LnxWrpFmPortDev->h_Dev, (e_FmPortCounters) counter)); local_irq_restore(flags); @@ -223,8 +222,8 @@ static struct attribute *fm_oh_port_dev_stats_attributes[] = { &dev_attr_port_deq_total.attr, &dev_attr_port_deq_from_default.attr, &dev_attr_port_deq_confirm.attr, - /*RX*/ &dev_attr_port_rx_bad_frame.attr, - &dev_attr_port_rx_large_frame.attr, + /* &dev_attr_port_rx_bad_frame.attr, */ + /* &dev_attr_port_rx_large_frame.attr, */ &dev_attr_port_rx_out_of_buffers_discard.attr, /*&dev_attr_port_rx_filter_frame.attr, */ NULL diff --git a/drivers/net/ethernet/freescale/fman/src/xx/xx_linux.c b/drivers/net/ethernet/freescale/fman/src/xx/xx_linux.c index 9c2371d..132459b 100644 --- a/drivers/net/ethernet/freescale/fman/src/xx/xx_linux.c +++ b/drivers/net/ethernet/freescale/fman/src/xx/xx_linux.c @@ -168,7 +168,7 @@ void XX_Print(char *str, ...) #ifdef CONFIG_SMP if (vsnprintf (buf, BUF_SIZE, str, args) >= BUF_SIZE) printk(KERN_WARNING "Illegal string to print!\n more than %d characters.\n\tString was not printed completelly.\n", BUF_SIZE); - printk (KERN_CRIT "cpu%d: %s",raw_smp_processor_id(), buf); + printk(KERN_CRIT "cpu%d/%d: %s", get_hard_smp_processor_id(raw_smp_processor_id()), raw_smp_processor_id(), buf); #else vprintk(str, args); #endif /* CONFIG_SMP */ @@ -186,7 +186,8 @@ void XX_Fprint(void *file, char *str, ...) #ifdef CONFIG_SMP if (vsnprintf (buf, BUF_SIZE, str, args) >= BUF_SIZE) printk(KERN_WARNING "Illegal string to print!\n more than %d characters.\n\tString was not printed completelly.\n", BUF_SIZE); - printk (KERN_CRIT "cpu%d: %s", raw_smp_processor_id(), buf); + printk (KERN_CRIT "cpu%d/%d: %s",hard_smp_processor_id(), smp_processor_id(), buf); + #else vprintk(str, args); #endif /* CONFIG_SMP */ @@ -353,14 +354,14 @@ uint32_t XX_DisableAllIntr(void) { unsigned long flags; - local_irq_save(flags); + local_irq_save_nort(flags); return (uint32_t)flags; } void XX_RestoreAllIntr(uint32_t flags) { - local_irq_restore((unsigned long)flags); + local_irq_restore_nort((unsigned long)flags); } t_Error XX_Call( uint32_t qid, t_Error (* f)(t_Handle), t_Handle id, t_Handle appId, uint16_t flags ) diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c index a53231c..eb60e10 100644 --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c @@ -1153,6 +1153,7 @@ static void gfar_init_recycle(struct gfar_private *priv) rec->buff_size = priv->rx_buffer_size + RXBUF_ALIGNMENT; skb_queue_head_init(&rec->recycle_q); + rec->local = NULL; if (!gfar_skb_recycling_en) goto disable_rec; @@ -2141,6 +2142,9 @@ static void free_skb_recycle_q(struct gfar_priv_recycle *rec) while ((skb = skb_dequeue(&rec->recycle_q)) != NULL) dev_kfree_skb_any(skb); + if (!rec->local) + return; + for_each_possible_cpu(cpu) { struct gfar_priv_recycle_local *local; @@ -3490,6 +3494,9 @@ static struct sk_buff *gfar_new_skb(struct gfar_private *priv) struct sk_buff_head *recycle_q; int cpu; + if (unlikely(!rec->local)) + goto alloc; + cpu = get_cpu(); local = per_cpu_ptr(rec->local, cpu); skb = __skb_dequeue(&local->recycle_q); diff --git a/drivers/net/ethernet/freescale/gianfar_sysfs.c b/drivers/net/ethernet/freescale/gianfar_sysfs.c index 83d725b..b9c1641 100644 --- a/drivers/net/ethernet/freescale/gianfar_sysfs.c +++ b/drivers/net/ethernet/freescale/gianfar_sysfs.c @@ -375,6 +375,9 @@ static ssize_t gfar_show_recycle(struct device *dev, for_each_possible_cpu(cpu) { struct gfar_priv_recycle_local *local; + if (!rec->local) + break; + local = per_cpu_ptr(rec->local, cpu); pr_info("local: CPU#%d: recycled skbs %d, reused skbs %d\n", cpu, local->recycle_cnt, local->reuse_cnt); diff --git a/drivers/staging/fsl_dpa_offload/dpa_classifier.c b/drivers/staging/fsl_dpa_offload/dpa_classifier.c index 89aaa2e..a39fc69 100644 --- a/drivers/staging/fsl_dpa_offload/dpa_classifier.c +++ b/drivers/staging/fsl_dpa_offload/dpa_classifier.c @@ -430,7 +430,8 @@ int dpa_classif_table_modify_miss_action(int td, /* Fill the [miss_engine_params] structure w/ data */ errno = action_to_next_engine_params(miss_action, &miss_engine_params, - NULL, NULL, NULL); + NULL, ptable->params.distribution, + ptable->params.classification); if (errno < 0) { RELEASE_OBJECT(ptable); log_err("Failed verification of miss action params for table " @@ -7226,7 +7227,8 @@ EXPORT_SYMBOL(dpa_classif_free_hm); #if (DPAA_VERSION >= 11) int dpa_classif_mcast_create_group( const struct dpa_cls_mcast_group_params *group_params, - int *grpd) + int *grpd, + const struct dpa_cls_mcast_group_resources *res) { t_Error err = 0; @@ -7321,7 +7323,7 @@ int dpa_classif_mcast_create_group( } /* Group is not imported */ - if (group_params->group == NULL) { + if (!res) { /* * set parameters for the first member */ @@ -7439,7 +7441,7 @@ int dpa_classif_mcast_create_group( kfree(replic_grp_params); } else { - pgroup->group = group_params->group; + pgroup->group = res->group_node; /* mark prefilled members in index array member */ for (member_id = 0; member_id < group_params->prefilled_members; member_id++) { diff --git a/drivers/staging/fsl_dpa_offload/dpa_classifier_ioctl.h b/drivers/staging/fsl_dpa_offload/dpa_classifier_ioctl.h index cc5f007..df0fee2 100644 --- a/drivers/staging/fsl_dpa_offload/dpa_classifier_ioctl.h +++ b/drivers/staging/fsl_dpa_offload/dpa_classifier_ioctl.h @@ -176,11 +176,7 @@ struct ioc_dpa_cls_hm_mpls_params { struct ioc_dpa_cls_mcast_group_params { struct dpa_cls_mcast_group_params mcast_grp_params; int grpd; -}; - -struct ioc_dpa_cls_mcast_import_params { - void *group; - int grpd; + struct dpa_cls_mcast_group_resources res; }; struct ioc_dpa_cls_mcast_member_params { @@ -487,14 +483,18 @@ struct dpa_cls_compat_mcast_group_params { compat_uptr_t fm_pcd; struct dpa_cls_compat_tbl_enq_action_desc first_member_params; unsigned int prefilled_members; - compat_uptr_t group; compat_uptr_t distribution; compat_uptr_t classification; }; +struct dpa_cls_compat_mcast_group_resources { + compat_uptr_t group_node; +}; + struct compat_ioc_dpa_cls_mcast_group_params { struct dpa_cls_compat_mcast_group_params mcast_grp_params; int grpd; + struct dpa_cls_compat_mcast_group_resources res; }; struct compat_ioc_dpa_cls_mcast_member_params { diff --git a/drivers/staging/fsl_dpa_offload/dpa_ipsec.c b/drivers/staging/fsl_dpa_offload/dpa_ipsec.c index fb076f4..797bee5 100644 --- a/drivers/staging/fsl_dpa_offload/dpa_ipsec.c +++ b/drivers/staging/fsl_dpa_offload/dpa_ipsec.c @@ -808,7 +808,7 @@ static int init_sa_manager(struct dpa_ipsec *dpa_ipsec) return -ENOMEM; } - /* fill with ids */ + /* fill with IDs */ for (i = 0; i < sa_mng->max_num_sa; i++) if (cq_put_4bytes(sa_mng->sa_id_cq, i) < 0) { pr_err("Could not fill SA ID management CQ\n"); @@ -865,7 +865,8 @@ static int init_sa_manager(struct dpa_ipsec *dpa_ipsec) return -ENOMEM; } - /* Allocate space for the SEC descriptor which is holding the + /* + * Allocate space for the SEC descriptor which is holding the * preheader information and the share descriptor. * Required 64 byte align. */ @@ -2310,7 +2311,7 @@ static int create_sa_fq_pair(struct dpa_ipsec_sa *sa, } static inline int set_cipher_auth_alg(enum dpa_ipsec_cipher_alg alg_suite, - uint16_t *cipher, uint16_t *auth) + uint16_t *cipher, uint16_t *auth) { *cipher = ipsec_algs[alg_suite].enc_alg; *auth = ipsec_algs[alg_suite].auth_alg; @@ -2969,7 +2970,7 @@ static int check_sa_params(struct dpa_ipsec_sa_params *sa_params) /* * check crypto params: * - an authentication key must always be provided - * - a cipher key must be provided if alg != NULL encryption + * - a cipher key must be provided if algorithm != NULL encryption */ err = set_cipher_auth_alg(sa_params->crypto_params.alg_suite, @@ -2977,20 +2978,23 @@ static int check_sa_params(struct dpa_ipsec_sa_params *sa_params) if (err < 0) return err; - if (sa_params->crypto_params.auth_key == NULL) { + if (!sa_params->crypto_params.auth_key || + sa_params->crypto_params.auth_key_len == 0) { pr_err("A valid authentication key must be provided\n"); return -EINVAL; } - /* TODO: check cipher_key ONLY if alg != null encryption */ - if (sa_params->crypto_params.cipher_key == NULL) { + /* Check cipher_key only if the cipher algorithm isn't NULL encryption*/ + if (cipher_alg != OP_PCL_IPSEC_NULL_ENC && + (!sa_params->crypto_params.cipher_key || + sa_params->crypto_params.cipher_key_len == 0)) { pr_err("A valid cipher key must be provided\n"); return -EINVAL; } if (sa_params->sa_dir == DPA_IPSEC_OUTBOUND) { - if ((sa_params->sa_out_params.ip_hdr_size == 0) || - (sa_params->sa_out_params.outer_ip_header == NULL)) { + if (sa_params->sa_out_params.ip_hdr_size == 0 || + !sa_params->sa_out_params.outer_ip_header) { pr_err("Transport mode is not currently supported." "Specify a valid encapsulation header\n"); return -EINVAL; @@ -3435,6 +3439,7 @@ int dpa_ipsec_create_sa(int dpa_ipsec_id, memset(&action, 0, sizeof(action)); action.type = DPA_CLS_TBL_ACTION_NEXT_TABLE; action.next_table_params.next_td = inbpol_td; + action.next_table_params.hmd = DPA_OFFLD_DESC_NONE; action.enable_statistics = FALSE; err = set_flow_id_action(sa, &action); if (err < 0) { diff --git a/drivers/staging/fsl_dpa_offload/dpa_ipsec.h b/drivers/staging/fsl_dpa_offload/dpa_ipsec.h index c08419f..25eca88 100644 --- a/drivers/staging/fsl_dpa_offload/dpa_ipsec.h +++ b/drivers/staging/fsl_dpa_offload/dpa_ipsec.h @@ -76,21 +76,21 @@ /* DPA_IPSEC_CIPHER_ALG_3DES_CBC_HMAC_SHA_512_256 */ \ IPSEC_ALGS_ENTRY(3DES, HMAC_SHA2_512_256), \ /* DPA_IPSEC_CIPHER_ALG_NULL_ENC_HMAC_96_MD5_128 */ \ - IPSEC_ALGS_ENTRY(INVALID_ALG_ID, HMAC_MD5_96), \ + IPSEC_ALGS_ENTRY(NULL_ENC, HMAC_MD5_96), \ /* DPA_IPSEC_CIPHER_ALG_NULL_ENC_HMAC_96_SHA_160 */ \ - IPSEC_ALGS_ENTRY(INVALID_ALG_ID, HMAC_SHA1_96), \ + IPSEC_ALGS_ENTRY(NULL_ENC, HMAC_SHA1_96), \ /* DPA_IPSEC_CIPHER_ALG_NULL_ENC_AES_XCBC_MAC_96 */ \ - IPSEC_ALGS_ENTRY(INVALID_ALG_ID, AES_XCBC_MAC_96), \ + IPSEC_ALGS_ENTRY(NULL_ENC, AES_XCBC_MAC_96), \ /* DPA_IPSEC_CIPHER_ALG_NULL_ENC_HMAC_MD5_128 */ \ - IPSEC_ALGS_ENTRY(INVALID_ALG_ID, HMAC_MD5_128), \ + IPSEC_ALGS_ENTRY(NULL_ENC, HMAC_MD5_128), \ /* DPA_IPSEC_CIPHER_ALG_NULL_ENC_HMAC_SHA_160 */ \ - IPSEC_ALGS_ENTRY(INVALID_ALG_ID, HMAC_SHA1_160), \ + IPSEC_ALGS_ENTRY(NULL_ENC, HMAC_SHA1_160), \ /* DPA_IPSEC_CIPHER_ALG_NULL_ENC_HMAC_SHA_256_128 */ \ - IPSEC_ALGS_ENTRY(INVALID_ALG_ID, HMAC_SHA2_256_128), \ + IPSEC_ALGS_ENTRY(NULL_ENC, HMAC_SHA2_256_128), \ /* DPA_IPSEC_CIPHER_ALG_NULL_ENC_HMAC_SHA_384_192 */ \ - IPSEC_ALGS_ENTRY(INVALID_ALG_ID, HMAC_SHA2_384_192), \ + IPSEC_ALGS_ENTRY(NULL_ENC, HMAC_SHA2_384_192), \ /* DPA_IPSEC_CIPHER_ALG_NULL_ENC_HMAC_SHA_512_256 */ \ - IPSEC_ALGS_ENTRY(INVALID_ALG_ID, HMAC_SHA2_512_256), \ + IPSEC_ALGS_ENTRY(NULL_ENC, HMAC_SHA2_512_256), \ /* DPA_IPSEC_CIPHER_ALG_AES_CBC_HMAC_96_MD5_128 */ \ IPSEC_ALGS_ENTRY(AES_CBC, HMAC_MD5_96), \ /* DPA_IPSEC_CIPHER_ALG_AES_CBC_HMAC_96_SHA_160 */ \ diff --git a/drivers/staging/fsl_dpa_offload/wrp_dpa_classifier.c b/drivers/staging/fsl_dpa_offload/wrp_dpa_classifier.c index dadf609..1e35b09 100644 --- a/drivers/staging/fsl_dpa_offload/wrp_dpa_classifier.c +++ b/drivers/staging/fsl_dpa_offload/wrp_dpa_classifier.c @@ -1541,6 +1541,7 @@ static long do_ioctl_mcast_create_group(unsigned long args, bool compat_mode) long ret = 0; struct ioc_dpa_cls_mcast_group_params kparam; struct dpa_cls_tbl_policer_params policer_params; + struct dpa_cls_mcast_group_resources *p_res = NULL; #ifdef CONFIG_COMPAT struct compat_ioc_dpa_cls_mcast_group_params uparam; if (compat_mode) { @@ -1580,10 +1581,13 @@ static long do_ioctl_mcast_create_group(unsigned long args, bool compat_mode) &policer_params; } } + + if (kparam.res.group_node) + p_res = &kparam.res; /* * Translate FM_PCD file descriptor */ - if (!kparam.mcast_grp_params.group) { + if (!p_res) { kparam.mcast_grp_params.fm_pcd = translate_fm_pcd_handle(kparam. mcast_grp_params.fm_pcd); @@ -1593,7 +1597,7 @@ static long do_ioctl_mcast_create_group(unsigned long args, bool compat_mode) #if (DPAA_VERSION >= 11) ret = dpa_classif_mcast_create_group(&kparam.mcast_grp_params, - &kparam.grpd); + &kparam.grpd, p_res); #else log_err("Multicast not supported on this platform.\n"); return -EINVAL; @@ -2407,7 +2411,8 @@ int dpa_cls_tbl_action_params_rcompatcpy( uparam->enq_params.new_fqid = kparam->enq_params.new_fqid; uparam->enq_params.hmd = kparam->enq_params.hmd; - + uparam->enq_params.new_rel_vsp_id = + kparam->enq_params.new_rel_vsp_id; if (kparam->enq_params.policer_params) { BUG_ON(!compat_ptr(uparam->enq_params.policer_params)); if (copy_to_user( @@ -2425,6 +2430,10 @@ int dpa_cls_tbl_action_params_rcompatcpy( kparam->next_table_params.next_td; uparam->next_table_params.hmd = kparam->next_table_params.hmd; break; + case DPA_CLS_TBL_ACTION_MCAST: + uparam->mcast_params.grpd = kparam->mcast_params.grpd; + uparam->mcast_params.hmd = kparam->mcast_params.hmd; + break; default: break; } @@ -2972,12 +2981,12 @@ int dpa_cls_mcast_group_params_compatcpy( kparam->mcast_grp_params.prefilled_members = uparam->mcast_grp_params.prefilled_members; - if (uparam->mcast_grp_params.group) - kparam->mcast_grp_params.group = compat_get_id2ptr( - uparam->mcast_grp_params.group, - FM_MAP_TYPE_PCD_NODE); + if (uparam->res.group_node) + kparam->res.group_node = compat_get_id2ptr( + uparam->res.group_node, + FM_MAP_TYPE_PCD_NODE); else - kparam->mcast_grp_params.group = NULL; + kparam->res.group_node = NULL; if (compat_ptr(uparam->mcast_grp_params.distribution)) kparam->mcast_grp_params.distribution = compat_get_id2ptr( diff --git a/drivers/staging/fsl_dpa_offload/wrp_dpa_stats.c b/drivers/staging/fsl_dpa_offload/wrp_dpa_stats.c index 4903afc..5c2cb90 100644 --- a/drivers/staging/fsl_dpa_offload/wrp_dpa_stats.c +++ b/drivers/staging/fsl_dpa_offload/wrp_dpa_stats.c @@ -67,6 +67,8 @@ static const struct file_operations dpa_stats_fops = { DECLARE_CRC8_TABLE(crc8_table); static int dpa_stats_cdev_major = -1; +static struct class *stats_class; +static struct device *stats_dev; struct wrp_dpa_stats_cb wrp_dpa_stats; @@ -177,6 +179,24 @@ int wrp_dpa_stats_init(void) return dpa_stats_cdev_major; } + stats_class = class_create(THIS_MODULE, DPA_STATS_CDEV); + if (IS_ERR(stats_class)) { + log_err("Cannot create DPA Stats class device\n"); + unregister_chrdev(dpa_stats_cdev_major, DPA_STATS_CDEV); + dpa_stats_cdev_major = -1; + return PTR_ERR(stats_class); + } + + stats_dev = device_create(stats_class, NULL, + MKDEV(dpa_stats_cdev_major, 0), NULL, DPA_STATS_CDEV); + if (IS_ERR(stats_dev)) { + log_err("Cannot create DPA Stats device\n"); + class_destroy(stats_class); + unregister_chrdev(dpa_stats_cdev_major, DPA_STATS_CDEV); + dpa_stats_cdev_major = -1; + return PTR_ERR(stats_dev); + } + /* Initialize the event queue */ wrp_dpa_stats_event_queue_init(&wrp_dpa_stats.ev_queue); @@ -187,6 +207,8 @@ int wrp_dpa_stats_exit(void) { if (dpa_stats_cdev_major < 0) return 0; + device_destroy(stats_class, MKDEV(dpa_stats_cdev_major, 0)); + class_destroy(stats_class); unregister_chrdev(dpa_stats_cdev_major, DPA_STATS_CDEV); dpa_stats_cdev_major = -1; |