diff options
Diffstat (limited to 'arch/powerpc/sysdev/qe_lib/ucc_slow.c')
-rw-r--r-- | arch/powerpc/sysdev/qe_lib/ucc_slow.c | 48 |
1 files changed, 23 insertions, 25 deletions
diff --git a/arch/powerpc/sysdev/qe_lib/ucc_slow.c b/arch/powerpc/sysdev/qe_lib/ucc_slow.c index 1f65c26ce63..0174b3aeef8 100644 --- a/arch/powerpc/sysdev/qe_lib/ucc_slow.c +++ b/arch/powerpc/sysdev/qe_lib/ucc_slow.c | |||
@@ -115,11 +115,15 @@ void ucc_slow_disable(struct ucc_slow_private * uccs, enum comm_dir mode) | |||
115 | out_be32(&us_regs->gumr_l, gumr_l); | 115 | out_be32(&us_regs->gumr_l, gumr_l); |
116 | } | 116 | } |
117 | 117 | ||
118 | /* Initialize the UCC for Slow operations | ||
119 | * | ||
120 | * The caller should initialize the following us_info | ||
121 | */ | ||
118 | int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** uccs_ret) | 122 | int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** uccs_ret) |
119 | { | 123 | { |
120 | struct ucc_slow_private *uccs; | 124 | struct ucc_slow_private *uccs; |
121 | u32 i; | 125 | u32 i; |
122 | struct ucc_slow *us_regs; | 126 | struct ucc_slow __iomem *us_regs; |
123 | u32 gumr; | 127 | u32 gumr; |
124 | struct qe_bd *bd; | 128 | struct qe_bd *bd; |
125 | u32 id; | 129 | u32 id; |
@@ -131,7 +135,7 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc | |||
131 | 135 | ||
132 | /* check if the UCC port number is in range. */ | 136 | /* check if the UCC port number is in range. */ |
133 | if ((us_info->ucc_num < 0) || (us_info->ucc_num > UCC_MAX_NUM - 1)) { | 137 | if ((us_info->ucc_num < 0) || (us_info->ucc_num > UCC_MAX_NUM - 1)) { |
134 | printk(KERN_ERR "%s: illegal UCC number", __FUNCTION__); | 138 | printk(KERN_ERR "%s: illegal UCC number\n", __FUNCTION__); |
135 | return -EINVAL; | 139 | return -EINVAL; |
136 | } | 140 | } |
137 | 141 | ||
@@ -143,13 +147,14 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc | |||
143 | */ | 147 | */ |
144 | if ((!us_info->rfw) && | 148 | if ((!us_info->rfw) && |
145 | (us_info->max_rx_buf_length & (UCC_SLOW_MRBLR_ALIGNMENT - 1))) { | 149 | (us_info->max_rx_buf_length & (UCC_SLOW_MRBLR_ALIGNMENT - 1))) { |
146 | printk(KERN_ERR "max_rx_buf_length not aligned."); | 150 | printk(KERN_ERR "max_rx_buf_length not aligned.\n"); |
147 | return -EINVAL; | 151 | return -EINVAL; |
148 | } | 152 | } |
149 | 153 | ||
150 | uccs = kzalloc(sizeof(struct ucc_slow_private), GFP_KERNEL); | 154 | uccs = kzalloc(sizeof(struct ucc_slow_private), GFP_KERNEL); |
151 | if (!uccs) { | 155 | if (!uccs) { |
152 | printk(KERN_ERR "%s: Cannot allocate private data", __FUNCTION__); | 156 | printk(KERN_ERR "%s: Cannot allocate private data\n", |
157 | __FUNCTION__); | ||
153 | return -ENOMEM; | 158 | return -ENOMEM; |
154 | } | 159 | } |
155 | 160 | ||
@@ -158,7 +163,7 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc | |||
158 | /* Set the PHY base address */ | 163 | /* Set the PHY base address */ |
159 | uccs->us_regs = ioremap(us_info->regs, sizeof(struct ucc_slow)); | 164 | uccs->us_regs = ioremap(us_info->regs, sizeof(struct ucc_slow)); |
160 | if (uccs->us_regs == NULL) { | 165 | if (uccs->us_regs == NULL) { |
161 | printk(KERN_ERR "%s: Cannot map UCC registers", __FUNCTION__); | 166 | printk(KERN_ERR "%s: Cannot map UCC registers\n", __FUNCTION__); |
162 | return -ENOMEM; | 167 | return -ENOMEM; |
163 | } | 168 | } |
164 | 169 | ||
@@ -182,22 +187,14 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc | |||
182 | return -ENOMEM; | 187 | return -ENOMEM; |
183 | } | 188 | } |
184 | id = ucc_slow_get_qe_cr_subblock(us_info->ucc_num); | 189 | id = ucc_slow_get_qe_cr_subblock(us_info->ucc_num); |
185 | qe_issue_cmd(QE_ASSIGN_PAGE_TO_DEVICE, id, QE_CR_PROTOCOL_UNSPECIFIED, | 190 | qe_issue_cmd(QE_ASSIGN_PAGE_TO_DEVICE, id, us_info->protocol, |
186 | uccs->us_pram_offset); | 191 | uccs->us_pram_offset); |
187 | 192 | ||
188 | uccs->us_pram = qe_muram_addr(uccs->us_pram_offset); | 193 | uccs->us_pram = qe_muram_addr(uccs->us_pram_offset); |
189 | 194 | ||
190 | /* Init Guemr register */ | ||
191 | if ((ret = ucc_init_guemr((struct ucc_common *) us_regs))) { | ||
192 | printk(KERN_ERR "%s: cannot init GUEMR", __FUNCTION__); | ||
193 | ucc_slow_free(uccs); | ||
194 | return ret; | ||
195 | } | ||
196 | |||
197 | /* Set UCC to slow type */ | 195 | /* Set UCC to slow type */ |
198 | if ((ret = ucc_set_type(us_info->ucc_num, | 196 | ret = ucc_set_type(us_info->ucc_num, UCC_SPEED_TYPE_SLOW); |
199 | (struct ucc_common *) us_regs, | 197 | if (ret) { |
200 | UCC_SPEED_TYPE_SLOW))) { | ||
201 | printk(KERN_ERR "%s: cannot set UCC type", __FUNCTION__); | 198 | printk(KERN_ERR "%s: cannot set UCC type", __FUNCTION__); |
202 | ucc_slow_free(uccs); | 199 | ucc_slow_free(uccs); |
203 | return ret; | 200 | return ret; |
@@ -212,7 +209,8 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc | |||
212 | qe_muram_alloc(us_info->rx_bd_ring_len * sizeof(struct qe_bd), | 209 | qe_muram_alloc(us_info->rx_bd_ring_len * sizeof(struct qe_bd), |
213 | QE_ALIGNMENT_OF_BD); | 210 | QE_ALIGNMENT_OF_BD); |
214 | if (IS_ERR_VALUE(uccs->rx_base_offset)) { | 211 | if (IS_ERR_VALUE(uccs->rx_base_offset)) { |
215 | printk(KERN_ERR "%s: cannot allocate RX BDs", __FUNCTION__); | 212 | printk(KERN_ERR "%s: cannot allocate %u RX BDs\n", __FUNCTION__, |
213 | us_info->rx_bd_ring_len); | ||
216 | uccs->rx_base_offset = 0; | 214 | uccs->rx_base_offset = 0; |
217 | ucc_slow_free(uccs); | 215 | ucc_slow_free(uccs); |
218 | return -ENOMEM; | 216 | return -ENOMEM; |
@@ -292,12 +290,12 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc | |||
292 | 290 | ||
293 | /* if the data is in cachable memory, the 'global' */ | 291 | /* if the data is in cachable memory, the 'global' */ |
294 | /* in the function code should be set. */ | 292 | /* in the function code should be set. */ |
295 | uccs->us_pram->tfcr = uccs->us_pram->rfcr = | 293 | uccs->us_pram->tbmr = UCC_BMR_BO_BE; |
296 | us_info->data_mem_part | QE_BMR_BYTE_ORDER_BO_MOT; | 294 | uccs->us_pram->rbmr = UCC_BMR_BO_BE; |
297 | 295 | ||
298 | /* rbase, tbase are offsets from MURAM base */ | 296 | /* rbase, tbase are offsets from MURAM base */ |
299 | out_be16(&uccs->us_pram->rbase, uccs->us_pram_offset); | 297 | out_be16(&uccs->us_pram->rbase, uccs->rx_base_offset); |
300 | out_be16(&uccs->us_pram->tbase, uccs->us_pram_offset); | 298 | out_be16(&uccs->us_pram->tbase, uccs->tx_base_offset); |
301 | 299 | ||
302 | /* Mux clocking */ | 300 | /* Mux clocking */ |
303 | /* Grant Support */ | 301 | /* Grant Support */ |
@@ -311,7 +309,7 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc | |||
311 | /* Rx clock routing */ | 309 | /* Rx clock routing */ |
312 | if (ucc_set_qe_mux_rxtx(us_info->ucc_num, us_info->rx_clock, | 310 | if (ucc_set_qe_mux_rxtx(us_info->ucc_num, us_info->rx_clock, |
313 | COMM_DIR_RX)) { | 311 | COMM_DIR_RX)) { |
314 | printk(KERN_ERR "%s: illegal value for RX clock", | 312 | printk(KERN_ERR "%s: illegal value for RX clock\n", |
315 | __FUNCTION__); | 313 | __FUNCTION__); |
316 | ucc_slow_free(uccs); | 314 | ucc_slow_free(uccs); |
317 | return -EINVAL; | 315 | return -EINVAL; |
@@ -319,7 +317,7 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc | |||
319 | /* Tx clock routing */ | 317 | /* Tx clock routing */ |
320 | if (ucc_set_qe_mux_rxtx(us_info->ucc_num, us_info->tx_clock, | 318 | if (ucc_set_qe_mux_rxtx(us_info->ucc_num, us_info->tx_clock, |
321 | COMM_DIR_TX)) { | 319 | COMM_DIR_TX)) { |
322 | printk(KERN_ERR "%s: illegal value for TX clock", | 320 | printk(KERN_ERR "%s: illegal value for TX clock\n", |
323 | __FUNCTION__); | 321 | __FUNCTION__); |
324 | ucc_slow_free(uccs); | 322 | ucc_slow_free(uccs); |
325 | return -EINVAL; | 323 | return -EINVAL; |
@@ -343,8 +341,8 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc | |||
343 | command = QE_INIT_TX; | 341 | command = QE_INIT_TX; |
344 | else | 342 | else |
345 | command = QE_INIT_RX; /* We know at least one is TRUE */ | 343 | command = QE_INIT_RX; /* We know at least one is TRUE */ |
346 | id = ucc_slow_get_qe_cr_subblock(us_info->ucc_num); | 344 | |
347 | qe_issue_cmd(command, id, QE_CR_PROTOCOL_UNSPECIFIED, 0); | 345 | qe_issue_cmd(command, id, us_info->protocol, 0); |
348 | 346 | ||
349 | *uccs_ret = uccs; | 347 | *uccs_ret = uccs; |
350 | return 0; | 348 | return 0; |