return err;
}
+static int
+xsdfec_set_order(struct xsdfec_dev *xsdfec, enum xsdfec_order __user order)
+{
+ bool order_out_of_range;
+
+ order_out_of_range = (order <= XSDFEC_INVALID_ORDER) ||
+ (order >= XSDFEC_ORDER_MAX);
+ if (order_out_of_range) {
+ dev_err(xsdfec->dev,
+ "%s invalid order value %d for SDFEC%d",
+ __func__, order, xsdfec->fec_id);
+ return -EINVAL;
+ }
+
+ /* Verify Device has not started */
+ if (xsdfec->state == XSDFEC_STARTED) {
+ dev_err(xsdfec->dev,
+ "%s attempting to set Order while started for SDFEC%d",
+ __func__, xsdfec->fec_id);
+ return -EIO;
+ }
+
+ xsdfec_regwrite(xsdfec, XSDFEC_ORDER_ADDR, (order - 1));
+
+ xsdfec->order = order;
+
+ return 0;
+}
+
static int xsdfec_start(struct xsdfec_dev *xsdfec)
{
u32 regread;
return rval;
rval = xsdfec_get_ldpc_code_params(xsdfec, arg);
break;
+ case XSDFEC_SET_ORDER:
+ rval = xsdfec_set_order(xsdfec, (enum xsdfec_order)data);
+ break;
default:
/* Should not get here */
dev_err(xsdfec->dev, "Undefined SDFEC IOCTL");
XSDFEC_INVALID_ORDER = 0,
XSDFEC_MAINTAIN_ORDER,
XSDFEC_OUT_OF_ORDER,
+ XSDFEC_ORDER_MAX,
};
enum xsdfec_state {
/* ioctl that returns sdfec LDPC code param values, code_id must be specified */
#define XSDFEC_GET_LDPC_CODE_PARAMS \
_IOWR(XSDFEC_MAGIC, 9, struct xsdfec_ldpc_params *)
+/* ioctl that sets order, if order of blocks can change from input to output */
+#define XSDFEC_SET_ORDER _IOW(XSDFEC_MAGIC, 10, enum xsdfec_order)
#endif /* __XILINX_SDFEC_H__ */