diff options
Diffstat (limited to 'drivers/net/dsa/sja1105/sja1105_spi.c')
| -rw-r--r-- | drivers/net/dsa/sja1105/sja1105_spi.c | 409 | 
1 files changed, 176 insertions, 233 deletions
diff --git a/drivers/net/dsa/sja1105/sja1105_spi.c b/drivers/net/dsa/sja1105/sja1105_spi.c index 58dd37ecde17..29b127f3bf9c 100644 --- a/drivers/net/dsa/sja1105/sja1105_spi.c +++ b/drivers/net/dsa/sja1105/sja1105_spi.c @@ -7,42 +7,15 @@  #include <linux/packing.h>  #include "sja1105.h" -#define SJA1105_SIZE_PORT_CTRL		4  #define SJA1105_SIZE_RESET_CMD		4  #define SJA1105_SIZE_SPI_MSG_HEADER	4  #define SJA1105_SIZE_SPI_MSG_MAXLEN	(64 * 4) -#define SJA1105_SIZE_SPI_TRANSFER_MAX	\ -	(SJA1105_SIZE_SPI_MSG_HEADER + SJA1105_SIZE_SPI_MSG_MAXLEN) -static int sja1105_spi_transfer(const struct sja1105_private *priv, -				const void *tx, void *rx, int size) -{ -	struct spi_device *spi = priv->spidev; -	struct spi_transfer transfer = { -		.tx_buf = tx, -		.rx_buf = rx, -		.len = size, -	}; -	struct spi_message msg; -	int rc; - -	if (size > SJA1105_SIZE_SPI_TRANSFER_MAX) { -		dev_err(&spi->dev, "SPI message (%d) longer than max of %d\n", -			size, SJA1105_SIZE_SPI_TRANSFER_MAX); -		return -EMSGSIZE; -	} - -	spi_message_init(&msg); -	spi_message_add_tail(&transfer, &msg); - -	rc = spi_sync(spi, &msg); -	if (rc < 0) { -		dev_err(&spi->dev, "SPI transfer failed: %d\n", rc); -		return rc; -	} - -	return rc; -} +struct sja1105_chunk { +	u8	*buf; +	size_t	len; +	u64	reg_addr; +};  static void  sja1105_spi_message_pack(void *buf, const struct sja1105_spi_message *msg) @@ -56,242 +29,219 @@ sja1105_spi_message_pack(void *buf, const struct sja1105_spi_message *msg)  	sja1105_pack(buf, &msg->address,    24,  4, size);  } +#define sja1105_hdr_xfer(xfers, chunk) \ +	((xfers) + 2 * (chunk)) +#define sja1105_chunk_xfer(xfers, chunk) \ +	((xfers) + 2 * (chunk) + 1) +#define sja1105_hdr_buf(hdr_bufs, chunk) \ +	((hdr_bufs) + (chunk) * SJA1105_SIZE_SPI_MSG_HEADER) +  /* If @rw is:   * - SPI_WRITE: creates and sends an SPI write message at absolute - *		address reg_addr, taking size_bytes from *packed_buf + *		address reg_addr, taking @len bytes from *buf   * - SPI_READ:  creates and sends an SPI read message from absolute - *		address reg_addr, writing size_bytes into *packed_buf - * - * This function should only be called if it is priorly known that - * @size_bytes is smaller than SIZE_SPI_MSG_MAXLEN. Larger packed buffers - * are chunked in smaller pieces by sja1105_spi_send_long_packed_buf below. + *		address reg_addr, writing @len bytes into *buf   */ -int sja1105_spi_send_packed_buf(const struct sja1105_private *priv, -				sja1105_spi_rw_mode_t rw, u64 reg_addr, -				void *packed_buf, size_t size_bytes) +static int sja1105_xfer(const struct sja1105_private *priv, +			sja1105_spi_rw_mode_t rw, u64 reg_addr, u8 *buf, +			size_t len, struct ptp_system_timestamp *ptp_sts)  { -	u8 tx_buf[SJA1105_SIZE_SPI_TRANSFER_MAX] = {0}; -	u8 rx_buf[SJA1105_SIZE_SPI_TRANSFER_MAX] = {0}; -	const int msg_len = size_bytes + SJA1105_SIZE_SPI_MSG_HEADER; -	struct sja1105_spi_message msg = {0}; -	int rc; +	struct sja1105_chunk chunk = { +		.len = min_t(size_t, len, SJA1105_SIZE_SPI_MSG_MAXLEN), +		.reg_addr = reg_addr, +		.buf = buf, +	}; +	struct spi_device *spi = priv->spidev; +	struct spi_transfer *xfers; +	int num_chunks; +	int rc, i = 0; +	u8 *hdr_bufs; -	if (msg_len > SJA1105_SIZE_SPI_TRANSFER_MAX) -		return -ERANGE; +	num_chunks = DIV_ROUND_UP(len, SJA1105_SIZE_SPI_MSG_MAXLEN); -	msg.access = rw; -	msg.address = reg_addr; -	if (rw == SPI_READ) -		msg.read_count = size_bytes / 4; +	/* One transfer for each message header, one for each message +	 * payload (chunk). +	 */ +	xfers = kcalloc(2 * num_chunks, sizeof(struct spi_transfer), +			GFP_KERNEL); +	if (!xfers) +		return -ENOMEM; -	sja1105_spi_message_pack(tx_buf, &msg); +	/* Packed buffers for the num_chunks SPI message headers, +	 * stored as a contiguous array +	 */ +	hdr_bufs = kcalloc(num_chunks, SJA1105_SIZE_SPI_MSG_HEADER, +			   GFP_KERNEL); +	if (!hdr_bufs) { +		kfree(xfers); +		return -ENOMEM; +	} -	if (rw == SPI_WRITE) -		memcpy(tx_buf + SJA1105_SIZE_SPI_MSG_HEADER, -		       packed_buf, size_bytes); +	for (i = 0; i < num_chunks; i++) { +		struct spi_transfer *chunk_xfer = sja1105_chunk_xfer(xfers, i); +		struct spi_transfer *hdr_xfer = sja1105_hdr_xfer(xfers, i); +		u8 *hdr_buf = sja1105_hdr_buf(hdr_bufs, i); +		struct spi_transfer *ptp_sts_xfer; +		struct sja1105_spi_message msg; + +		/* Populate the transfer's header buffer */ +		msg.address = chunk.reg_addr; +		msg.access = rw; +		if (rw == SPI_READ) +			msg.read_count = chunk.len / 4; +		else +			/* Ignored */ +			msg.read_count = 0; +		sja1105_spi_message_pack(hdr_buf, &msg); +		hdr_xfer->tx_buf = hdr_buf; +		hdr_xfer->len = SJA1105_SIZE_SPI_MSG_HEADER; + +		/* Populate the transfer's data buffer */ +		if (rw == SPI_READ) +			chunk_xfer->rx_buf = chunk.buf; +		else +			chunk_xfer->tx_buf = chunk.buf; +		chunk_xfer->len = chunk.len; + +		/* Request timestamping for the transfer. Instead of letting +		 * callers specify which byte they want to timestamp, we can +		 * make certain assumptions: +		 * - A read operation will request a software timestamp when +		 *   what's being read is the PTP time. That is snapshotted by +		 *   the switch hardware at the end of the command portion +		 *   (hdr_xfer). +		 * - A write operation will request a software timestamp on +		 *   actions that modify the PTP time. Taking clock stepping as +		 *   an example, the switch writes the PTP time at the end of +		 *   the data portion (chunk_xfer). +		 */ +		if (rw == SPI_READ) +			ptp_sts_xfer = hdr_xfer; +		else +			ptp_sts_xfer = chunk_xfer; +		ptp_sts_xfer->ptp_sts_word_pre = ptp_sts_xfer->len - 1; +		ptp_sts_xfer->ptp_sts_word_post = ptp_sts_xfer->len - 1; +		ptp_sts_xfer->ptp_sts = ptp_sts; + +		/* Calculate next chunk */ +		chunk.buf += chunk.len; +		chunk.reg_addr += chunk.len / 4; +		chunk.len = min_t(size_t, (ptrdiff_t)(buf + len - chunk.buf), +				  SJA1105_SIZE_SPI_MSG_MAXLEN); + +		/* De-assert the chip select after each chunk. */ +		if (chunk.len) +			chunk_xfer->cs_change = 1; +	} -	rc = sja1105_spi_transfer(priv, tx_buf, rx_buf, msg_len); +	rc = spi_sync_transfer(spi, xfers, 2 * num_chunks);  	if (rc < 0) -		return rc; +		dev_err(&spi->dev, "SPI transfer failed: %d\n", rc); -	if (rw == SPI_READ) -		memcpy(packed_buf, rx_buf + SJA1105_SIZE_SPI_MSG_HEADER, -		       size_bytes); +	kfree(hdr_bufs); +	kfree(xfers); -	return 0; +	return rc; +} + +int sja1105_xfer_buf(const struct sja1105_private *priv, +		     sja1105_spi_rw_mode_t rw, u64 reg_addr, +		     u8 *buf, size_t len) +{ +	return sja1105_xfer(priv, rw, reg_addr, buf, len, NULL);  }  /* If @rw is:   * - SPI_WRITE: creates and sends an SPI write message at absolute - *		address reg_addr, taking size_bytes from *packed_buf + *		address reg_addr   * - SPI_READ:  creates and sends an SPI read message from absolute - *		address reg_addr, writing size_bytes into *packed_buf + *		address reg_addr   *   * The u64 *value is unpacked, meaning that it's stored in the native   * CPU endianness and directly usable by software running on the core. - * - * This is a wrapper around sja1105_spi_send_packed_buf().   */ -int sja1105_spi_send_int(const struct sja1105_private *priv, -			 sja1105_spi_rw_mode_t rw, u64 reg_addr, -			 u64 *value, u64 size_bytes) +int sja1105_xfer_u64(const struct sja1105_private *priv, +		     sja1105_spi_rw_mode_t rw, u64 reg_addr, u64 *value, +		     struct ptp_system_timestamp *ptp_sts)  { -	u8 packed_buf[SJA1105_SIZE_SPI_MSG_MAXLEN]; +	u8 packed_buf[8];  	int rc; -	if (size_bytes > SJA1105_SIZE_SPI_MSG_MAXLEN) -		return -ERANGE; -  	if (rw == SPI_WRITE) -		sja1105_pack(packed_buf, value, 8 * size_bytes - 1, 0, -			     size_bytes); +		sja1105_pack(packed_buf, value, 63, 0, 8); -	rc = sja1105_spi_send_packed_buf(priv, rw, reg_addr, packed_buf, -					 size_bytes); +	rc = sja1105_xfer(priv, rw, reg_addr, packed_buf, 8, ptp_sts);  	if (rw == SPI_READ) -		sja1105_unpack(packed_buf, value, 8 * size_bytes - 1, 0, -			       size_bytes); +		sja1105_unpack(packed_buf, value, 63, 0, 8);  	return rc;  } -/* Should be used if a @packed_buf larger than SJA1105_SIZE_SPI_MSG_MAXLEN - * must be sent/received. Splitting the buffer into chunks and assembling - * those into SPI messages is done automatically by this function. - */ -int sja1105_spi_send_long_packed_buf(const struct sja1105_private *priv, -				     sja1105_spi_rw_mode_t rw, u64 base_addr, -				     void *packed_buf, u64 buf_len) +/* Same as above, but transfers only a 4 byte word */ +int sja1105_xfer_u32(const struct sja1105_private *priv, +		     sja1105_spi_rw_mode_t rw, u64 reg_addr, u32 *value, +		     struct ptp_system_timestamp *ptp_sts)  { -	struct chunk { -		void *buf_ptr; -		int len; -		u64 spi_address; -	} chunk; -	int distance_to_end; +	u8 packed_buf[4]; +	u64 tmp;  	int rc; -	/* Initialize chunk */ -	chunk.buf_ptr = packed_buf; -	chunk.spi_address = base_addr; -	chunk.len = min_t(int, buf_len, SJA1105_SIZE_SPI_MSG_MAXLEN); - -	while (chunk.len) { -		rc = sja1105_spi_send_packed_buf(priv, rw, chunk.spi_address, -						 chunk.buf_ptr, chunk.len); -		if (rc < 0) -			return rc; - -		chunk.buf_ptr += chunk.len; -		chunk.spi_address += chunk.len / 4; -		distance_to_end = (uintptr_t)(packed_buf + buf_len - -					      chunk.buf_ptr); -		chunk.len = min(distance_to_end, SJA1105_SIZE_SPI_MSG_MAXLEN); +	if (rw == SPI_WRITE) { +		/* The packing API only supports u64 as CPU word size, +		 * so we need to convert. +		 */ +		tmp = *value; +		sja1105_pack(packed_buf, &tmp, 31, 0, 4);  	} -	return 0; -} +	rc = sja1105_xfer(priv, rw, reg_addr, packed_buf, 4, ptp_sts); -/* Back-ported structure from UM11040 Table 112. - * Reset control register (addr. 100440h) - * In the SJA1105 E/T, only warm_rst and cold_rst are - * supported (exposed in UM10944 as rst_ctrl), but the bit - * offsets of warm_rst and cold_rst are actually reversed. - */ -struct sja1105_reset_cmd { -	u64 switch_rst; -	u64 cfg_rst; -	u64 car_rst; -	u64 otp_rst; -	u64 warm_rst; -	u64 cold_rst; -	u64 por_rst; -}; - -static void -sja1105et_reset_cmd_pack(void *buf, const struct sja1105_reset_cmd *reset) -{ -	const int size = SJA1105_SIZE_RESET_CMD; - -	memset(buf, 0, size); - -	sja1105_pack(buf, &reset->cold_rst, 3, 3, size); -	sja1105_pack(buf, &reset->warm_rst, 2, 2, size); -} - -static void -sja1105pqrs_reset_cmd_pack(void *buf, const struct sja1105_reset_cmd *reset) -{ -	const int size = SJA1105_SIZE_RESET_CMD; - -	memset(buf, 0, size); +	if (rw == SPI_READ) { +		sja1105_unpack(packed_buf, &tmp, 31, 0, 4); +		*value = tmp; +	} -	sja1105_pack(buf, &reset->switch_rst, 8, 8, size); -	sja1105_pack(buf, &reset->cfg_rst,    7, 7, size); -	sja1105_pack(buf, &reset->car_rst,    5, 5, size); -	sja1105_pack(buf, &reset->otp_rst,    4, 4, size); -	sja1105_pack(buf, &reset->warm_rst,   3, 3, size); -	sja1105_pack(buf, &reset->cold_rst,   2, 2, size); -	sja1105_pack(buf, &reset->por_rst,    1, 1, size); +	return rc;  } -static int sja1105et_reset_cmd(const void *ctx, const void *data) +static int sja1105et_reset_cmd(struct dsa_switch *ds)  { -	const struct sja1105_private *priv = ctx; -	const struct sja1105_reset_cmd *reset = data; +	struct sja1105_private *priv = ds->priv;  	const struct sja1105_regs *regs = priv->info->regs; -	struct device *dev = priv->ds->dev; -	u8 packed_buf[SJA1105_SIZE_RESET_CMD]; - -	if (reset->switch_rst || -	    reset->cfg_rst || -	    reset->car_rst || -	    reset->otp_rst || -	    reset->por_rst) { -		dev_err(dev, "Only warm and cold reset is supported " -			"for SJA1105 E/T!\n"); -		return -EINVAL; -	} - -	if (reset->warm_rst) -		dev_dbg(dev, "Warm reset requested\n"); -	if (reset->cold_rst) -		dev_dbg(dev, "Cold reset requested\n"); +	u8 packed_buf[SJA1105_SIZE_RESET_CMD] = {0}; +	const int size = SJA1105_SIZE_RESET_CMD; +	u64 cold_rst = 1; -	sja1105et_reset_cmd_pack(packed_buf, reset); +	sja1105_pack(packed_buf, &cold_rst, 3, 3, size); -	return sja1105_spi_send_packed_buf(priv, SPI_WRITE, regs->rgu, -					   packed_buf, SJA1105_SIZE_RESET_CMD); +	return sja1105_xfer_buf(priv, SPI_WRITE, regs->rgu, packed_buf, +				SJA1105_SIZE_RESET_CMD);  } -static int sja1105pqrs_reset_cmd(const void *ctx, const void *data) +static int sja1105pqrs_reset_cmd(struct dsa_switch *ds)  { -	const struct sja1105_private *priv = ctx; -	const struct sja1105_reset_cmd *reset = data; +	struct sja1105_private *priv = ds->priv;  	const struct sja1105_regs *regs = priv->info->regs; -	struct device *dev = priv->ds->dev; -	u8 packed_buf[SJA1105_SIZE_RESET_CMD]; - -	if (reset->switch_rst) -		dev_dbg(dev, "Main reset for all functional modules requested\n"); -	if (reset->cfg_rst) -		dev_dbg(dev, "Chip configuration reset requested\n"); -	if (reset->car_rst) -		dev_dbg(dev, "Clock and reset control logic reset requested\n"); -	if (reset->otp_rst) -		dev_dbg(dev, "OTP read cycle for reading product " -			"config settings requested\n"); -	if (reset->warm_rst) -		dev_dbg(dev, "Warm reset requested\n"); -	if (reset->cold_rst) -		dev_dbg(dev, "Cold reset requested\n"); -	if (reset->por_rst) -		dev_dbg(dev, "Power-on reset requested\n"); - -	sja1105pqrs_reset_cmd_pack(packed_buf, reset); - -	return sja1105_spi_send_packed_buf(priv, SPI_WRITE, regs->rgu, -					   packed_buf, SJA1105_SIZE_RESET_CMD); -} +	u8 packed_buf[SJA1105_SIZE_RESET_CMD] = {0}; +	const int size = SJA1105_SIZE_RESET_CMD; +	u64 cold_rst = 1; -static int sja1105_cold_reset(const struct sja1105_private *priv) -{ -	struct sja1105_reset_cmd reset = {0}; +	sja1105_pack(packed_buf, &cold_rst, 2, 2, size); -	reset.cold_rst = 1; -	return priv->info->reset_cmd(priv, &reset); +	return sja1105_xfer_buf(priv, SPI_WRITE, regs->rgu, packed_buf, +				SJA1105_SIZE_RESET_CMD);  }  int sja1105_inhibit_tx(const struct sja1105_private *priv,  		       unsigned long port_bitmap, bool tx_inhibited)  {  	const struct sja1105_regs *regs = priv->info->regs; -	u64 inhibit_cmd; +	u32 inhibit_cmd;  	int rc; -	rc = sja1105_spi_send_int(priv, SPI_READ, regs->port_control, -				  &inhibit_cmd, SJA1105_SIZE_PORT_CTRL); +	rc = sja1105_xfer_u32(priv, SPI_READ, regs->port_control, +			      &inhibit_cmd, NULL);  	if (rc < 0)  		return rc; @@ -300,8 +250,8 @@ int sja1105_inhibit_tx(const struct sja1105_private *priv,  	else  		inhibit_cmd &= ~port_bitmap; -	return sja1105_spi_send_int(priv, SPI_WRITE, regs->port_control, -				    &inhibit_cmd, SJA1105_SIZE_PORT_CTRL); +	return sja1105_xfer_u32(priv, SPI_WRITE, regs->port_control, +				&inhibit_cmd, NULL);  }  struct sja1105_status { @@ -339,9 +289,7 @@ static int sja1105_status_get(struct sja1105_private *priv,  	u8 packed_buf[4];  	int rc; -	rc = sja1105_spi_send_packed_buf(priv, SPI_READ, -					 regs->status, -					 packed_buf, 4); +	rc = sja1105_xfer_buf(priv, SPI_READ, regs->status, packed_buf, 4);  	if (rc < 0)  		return rc; @@ -429,7 +377,7 @@ int sja1105_static_config_upload(struct sja1105_private *priv)  	usleep_range(500, 1000);  	do {  		/* Put the SJA1105 in programming mode */ -		rc = sja1105_cold_reset(priv); +		rc = priv->info->reset_cmd(priv->ds);  		if (rc < 0) {  			dev_err(dev, "Failed to reset switch, retrying...\n");  			continue; @@ -437,9 +385,8 @@ int sja1105_static_config_upload(struct sja1105_private *priv)  		/* Wait for the switch to come out of reset */  		usleep_range(1000, 5000);  		/* Upload the static config to the device */ -		rc = sja1105_spi_send_long_packed_buf(priv, SPI_WRITE, -						      regs->config, -						      config_buf, buf_len); +		rc = sja1105_xfer_buf(priv, SPI_WRITE, regs->config, +				      config_buf, buf_len);  		if (rc < 0) {  			dev_err(dev, "Failed to upload config, retrying...\n");  			continue; @@ -482,12 +429,6 @@ int sja1105_static_config_upload(struct sja1105_private *priv)  		dev_info(dev, "Succeeded after %d tried\n", RETRIES - retries);  	} -	rc = sja1105_ptp_reset(priv); -	if (rc < 0) -		dev_err(dev, "Failed to reset PTP clock: %d\n", rc); - -	dev_info(dev, "Reset switch and programmed static config\n"); -  out:  	kfree(config_buf);  	return rc; @@ -516,10 +457,11 @@ static struct sja1105_regs sja1105et_regs = {  	.rmii_ref_clk = {0x100015, 0x10001C, 0x100023, 0x10002A, 0x100031},  	.rmii_ext_tx_clk = {0x100018, 0x10001F, 0x100026, 0x10002D, 0x100034},  	.ptpegr_ts = {0xC0, 0xC2, 0xC4, 0xC6, 0xC8}, +	.ptpschtm = 0x12, /* Spans 0x12 to 0x13 */  	.ptp_control = 0x17, -	.ptpclk = 0x18, /* Spans 0x18 to 0x19 */ +	.ptpclkval = 0x18, /* Spans 0x18 to 0x19 */  	.ptpclkrate = 0x1A, -	.ptptsclk = 0x1B, /* Spans 0x1B to 0x1C */ +	.ptpclkcorp = 0x1D,  };  static struct sja1105_regs sja1105pqrs_regs = { @@ -547,10 +489,11 @@ static struct sja1105_regs sja1105pqrs_regs = {  	.rmii_ext_tx_clk = {0x100017, 0x10001D, 0x100023, 0x100029, 0x10002F},  	.qlevel = {0x604, 0x614, 0x624, 0x634, 0x644},  	.ptpegr_ts = {0xC0, 0xC4, 0xC8, 0xCC, 0xD0}, +	.ptpschtm = 0x13, /* Spans 0x13 to 0x14 */  	.ptp_control = 0x18, -	.ptpclk = 0x19, +	.ptpclkval = 0x19,  	.ptpclkrate = 0x1B, -	.ptptsclk = 0x1C, +	.ptpclkcorp = 0x1E,  };  struct sja1105_info sja1105e_info = { @@ -563,7 +506,7 @@ struct sja1105_info sja1105e_info = {  	.reset_cmd		= sja1105et_reset_cmd,  	.fdb_add_cmd		= sja1105et_fdb_add,  	.fdb_del_cmd		= sja1105et_fdb_del, -	.ptp_cmd		= sja1105et_ptp_cmd, +	.ptp_cmd_packing	= sja1105et_ptp_cmd_packing,  	.regs			= &sja1105et_regs,  	.name			= "SJA1105E",  }; @@ -577,7 +520,7 @@ struct sja1105_info sja1105t_info = {  	.reset_cmd		= sja1105et_reset_cmd,  	.fdb_add_cmd		= sja1105et_fdb_add,  	.fdb_del_cmd		= sja1105et_fdb_del, -	.ptp_cmd		= sja1105et_ptp_cmd, +	.ptp_cmd_packing	= sja1105et_ptp_cmd_packing,  	.regs			= &sja1105et_regs,  	.name			= "SJA1105T",  }; @@ -592,7 +535,7 @@ struct sja1105_info sja1105p_info = {  	.reset_cmd		= sja1105pqrs_reset_cmd,  	.fdb_add_cmd		= sja1105pqrs_fdb_add,  	.fdb_del_cmd		= sja1105pqrs_fdb_del, -	.ptp_cmd		= sja1105pqrs_ptp_cmd, +	.ptp_cmd_packing	= sja1105pqrs_ptp_cmd_packing,  	.regs			= &sja1105pqrs_regs,  	.name			= "SJA1105P",  }; @@ -607,7 +550,7 @@ struct sja1105_info sja1105q_info = {  	.reset_cmd		= sja1105pqrs_reset_cmd,  	.fdb_add_cmd		= sja1105pqrs_fdb_add,  	.fdb_del_cmd		= sja1105pqrs_fdb_del, -	.ptp_cmd		= sja1105pqrs_ptp_cmd, +	.ptp_cmd_packing	= sja1105pqrs_ptp_cmd_packing,  	.regs			= &sja1105pqrs_regs,  	.name			= "SJA1105Q",  }; @@ -622,7 +565,7 @@ struct sja1105_info sja1105r_info = {  	.reset_cmd		= sja1105pqrs_reset_cmd,  	.fdb_add_cmd		= sja1105pqrs_fdb_add,  	.fdb_del_cmd		= sja1105pqrs_fdb_del, -	.ptp_cmd		= sja1105pqrs_ptp_cmd, +	.ptp_cmd_packing	= sja1105pqrs_ptp_cmd_packing,  	.regs			= &sja1105pqrs_regs,  	.name			= "SJA1105R",  }; @@ -638,6 +581,6 @@ struct sja1105_info sja1105s_info = {  	.reset_cmd		= sja1105pqrs_reset_cmd,  	.fdb_add_cmd		= sja1105pqrs_fdb_add,  	.fdb_del_cmd		= sja1105pqrs_fdb_del, -	.ptp_cmd		= sja1105pqrs_ptp_cmd, +	.ptp_cmd_packing	= sja1105pqrs_ptp_cmd_packing,  	.name			= "SJA1105S",  };  |